فك ضغط الملفات (zip، tar، tag.gz) باستخدام روبي
سؤال
أريد فك ضغط الكثير من الملفات المضغوطة.هل هناك وحدة نمطية أو برنامج نصي يتحقق من تنسيق الملف المضغوط ويفك ضغطه؟يجب أن يعمل هذا على نظام التشغيل Linux، ولا أهتم بأنظمة التشغيل الأخرى.
المحلول
لاستخراج الملفات من ملف .tar.gz يمكنك استخدام الطرق التالية من حزم توزيعها مع روبي:
require 'rubygems/package'
require 'zlib'
tar_extract = Gem::Package::TarReader.new(Zlib::GzipReader.open('Path/To/myfile.tar.gz'))
tar_extract.rewind # The extract has to be rewinded after every iteration
tar_extract.each do |entry|
puts entry.full_name
puts entry.directory?
puts entry.file?
# puts entry.read
end
tar_extract.close
وكل دخول من نوع جوهرة :: حزمة :: :: TarReader نقاط الدخول لملف أو دليل في ملف .tar.gz.
ويمكن استخدام كود مماثلة (استبدال القارئ مع الكاتب) لكتابة الملفات إلى ملف .tar.gz.
نصائح أخرى
وأسهل طريقة هي على الارجح الى استخدام زليب
وزليب هي مكتبة روبي. ما يلي هو برنامج بسيط لانتزاع ملف مضغوط من URL معين، فك الضغط، ولصق محتوياته على الشاشة.
require 'zlib'
require 'open-uri'
uri = "www.somedomain.com/filename.gz"
source = open(uri)
gz = Zlib::GzipReader.new(source)
result = gz.read
puts result
وآمل أن يساعد هذا.
وعلى الرغم من أن href="https://stackoverflow.com/a/11505644/170230"> هو الحق، لأنها لا تأخذ في الاعتبار <لأ href = "HTTPS: // ستاكوفيرفلوو. كوم / ف / 2078778/170230 "> القطران LongLinks (وحاول استخراج <لأ href =" http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html "يختلط = "نوفولو noreferrer"> جدك-7u40 لينكس-i586.tar.gz من أوراكل: P). يجب أن تكون التعليمات البرمجية التالية قادرة على القيام بذلك:
require 'rubygems/package'
require 'zlib'
TAR_LONGLINK = '././@LongLink'
tar_gz_archive = '/path/to/archive.tar.gz'
destination = '/where/extract/to'
Gem::Package::TarReader.new( Zlib::GzipReader.open tar_gz_archive ) do |tar|
dest = nil
tar.each do |entry|
if entry.full_name == TAR_LONGLINK
dest = File.join destination, entry.read.strip
next
end
dest ||= File.join destination, entry.full_name
if entry.directory?
File.delete dest if File.file? dest
FileUtils.mkdir_p dest, :mode => entry.header.mode, :verbose => false
elsif entry.file?
FileUtils.rm_rf dest if File.directory? dest
File.open dest, "wb" do |f|
f.print entry.read
end
FileUtils.chmod entry.header.mode, dest, :verbose => false
elsif entry.header.typeflag == '2' #Symlink!
File.symlink entry.header.linkname, dest
end
dest = nil
end
end
دراكو، شكرا لك مقتطف.تقوم بعض تقارير TAR بتشفير الدلائل كمسارات تنتهي بـ "/" - راجع هذا ويكي.على سبيل المثال القطران هو أوراكل سيرفر JRE 7u80 لنظام التشغيل Windows.هذا سوف يعمل بالنسبة لهم:
require 'fileutils'
require 'rubygems/package'
require 'zlib'
TAR_LONGLINK = '././@LongLink'
Gem::Package::TarReader.new( Zlib::GzipReader.open tar_gz_archive ) do |tar|
dest = nil
tar.each do |entry|
if entry.full_name == TAR_LONGLINK
dest = File.join destination, entry.read.strip
next
end
dest ||= File.join destination, entry.full_name
if entry.directory? || (entry.header.typeflag == '' && entry.full_name.end_with?('/'))
File.delete dest if File.file? dest
FileUtils.mkdir_p dest, :mode => entry.header.mode, :verbose => false
elsif entry.file? || (entry.header.typeflag == '' && !entry.full_name.end_with?('/'))
FileUtils.rm_rf dest if File.directory? dest
File.open dest, "wb" do |f|
f.print entry.read
end
FileUtils.chmod entry.header.mode, dest, :verbose => false
elsif entry.header.typeflag == '2' #Symlink!
File.symlink entry.header.linkname, dest
else
puts "Unkown tar entry: #{entry.full_name} type: #{entry.header.typeflag}."
end
dest = nil
end
end
end