使用 ruby 解压缩(zip、tar、tag.gz)文件
我想解压很多 zip 文件。 是否有模块或脚本可以检查 zip 文件的格式并对其进行解压缩? 这应该适用于Linux,我不关心其他操作系统。
I want to unzip a lot of zip files. Is there a module or script that checks which format the zip file is and decompresses it?
This should work on Linux, I don't care about other OSs.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(4)
¢蛋碎的人ぎ生2024-07-27 04:27:42
虽然 Florian 的答案是正确的,但它没有考虑tar LongLinks (尝试提取 jdk-7u40-linux-i586.tar.gz 来自 Oracle: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
も星光2024-07-27 04:27:42
Draco,谢谢你代码片段。 某些 TAR 将目录编码为以“/”结尾的路径 - 请参阅此 Wiki。 示例 tar 为 适用于 Windows 的 Oracle Server JRE 7u80< /a>. 这对他们有用:
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
~没有更多了~
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
要从 .tar.gz 文件中提取文件,您可以使用随 Ruby 分发的包中的以下方法:
Gem::Package::TarReader::Entry 指向 .tar.gz 文件中的文件或目录。
可以使用类似的代码(将 Reader 替换为 Writer)将文件写入 .tar.gz 文件。
To extract files from a .tar.gz file you can use the following methods from packages distributed with Ruby:
Each entry of type Gem::Package::TarReader::Entry points to a file or directory within the .tar.gz file.
Similar code can be used (replace Reader with Writer) to write files to a .tar.gz file.