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

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

要从.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文件。

最简单的方法是使用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 

我希望这有帮助。

虽然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 

德拉科,谢谢你的片段 。 一些TAR将目录编码为以’/’结尾的路径 – 请参阅此 Wiki。 Examlple tar是适用于Windows的Oracle Server JRE 7u80 。 这对他们有用:

 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