34

大量のzipファイルを解凍したい。zip ファイルの形式をチェックして解凍するモジュールまたはスクリプトはありますか? これは Linux で動作するはずです。他の OS は気にしません。

4

4 に答える 4

36

.tar.gz ファイルからファイルを抽出するには、Ruby で配布されているパッケージから次のメソッドを使用できます。

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

タイプGem::Package::TarReader::Entryの各エントリは、.tar.gz ファイル内のファイルまたはディレクトリを指します。

同様のコードを使用して (Reader を Writer に置き換えます)、ファイルを .tar.gz ファイルに書き込むことができます。

于 2012-07-16T13:41:44.567 に答える
30

最も簡単な方法は、おそらく Zlib を使用することです

Zlib は Ruby ライブラリです。次に示すのは、特定の URL から Zip ファイルを取得して解凍し、その内容を画面に貼り付ける簡単なプログラムです。

require 'zlib' 
require 'open-uri'

uri = "www.somedomain.com/filename.gz"
source = open(uri)
gz = Zlib::GzipReader.new(source) 
result = gz.read
puts result

これが役立つことを願っています。

于 2010-01-06T16:13:46.627 に答える
2

ドラコ、thx for you snippet . 一部の TAR は、ディレクトリを「/」で終わるパスとしてエンコードします。このWiki を参照してください。tar の例は、Oracle Server JRE 7u80 for 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
于 2015-07-09T07:17:52.313 に答える