سؤال

أريد فك ضغط الكثير من الملفات المضغوطة.هل هناك وحدة نمطية أو برنامج نصي يتحقق من تنسيق الملف المضغوط ويفك ضغطه؟يجب أن يعمل هذا على نظام التشغيل 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top