我想解压缩很多 zip 文件。是否有一个模块或脚本可以检查 zip 文件的格式并解压缩它?这应该适用于 Linux,我不关心其他操作系统。
问问题
39548 次
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 获取压缩文件,解压缩,然后将其内容粘贴到屏幕上。
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 回答
15
虽然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
于 2013-10-02T14:16:29.687 回答
2
德拉科,谢谢你的片段。一些 TAR 将目录编码为以“/”结尾的路径 - 请参阅此Wiki。示例 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
于 2015-07-09T07:17:52.313 回答