用ruby解压缩(zip,tar,tag.gz)文件

gus*_*ans 32 ruby zip gzip unzip tar

我想解压缩很多zip文件.是否有模块或脚本检查zip文件的格式并解压缩?这应该适用于Linux,我不关心其他操作系统.

Flo*_*aus 31

要从.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
Run Code Online (Sandbox Code Playgroud)

Gem :: Package :: TarReader :: Entry类型的每个条目都指向.tar.gz文件中的文件或目录.

可以使用类似的代码(将Reader替换为Writer)将文件写入.tar.gz文件.


小智 29

最简单的方法是使用Zlib

Zlib是一个Ruby库.接下来是一个简单的程序,用于从特定URL获取Zipped文件,解压缩并将其内容粘贴到屏幕上.

require 'zlib' 
require 'open-uri'

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

我希望这有帮助.


Dra*_*ter 13

虽然Florian的答案是正确的,但它没有考虑tar LongLinks(尝试从oracle:P中提取jdk-7u40-linux-i586.tar.gz).以下代码应该能够执行此操作:

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
Run Code Online (Sandbox Code Playgroud)