如何在另一个目录中的 .ZIP 文件中仅提取一种文件类型
How to extract only one file type within a .ZIP file on another directory
之前已经有人问过关于这个主题的类似问题,但我无法解决。我有一批 .ZIP 文件,我只需要从中提取所有的 .TXT 文件,然后将它们移动到另一个位置。我试过这个:
unzip test.zip '*.txt' #This would only be useful for extracting one single .ZIP file, not for each one.
还有这个:
require 'FileUtils'
require 'zip'
def unzip_file (file, destination)
Zip::File.open(file_path) { |zip_file|
zip_file.each { |f|
f_path=File.join("destination_path", f.name)
FileUtils.mkdir_p(File.dirname(f_path)) #Don't quite understand this line
zip_file.extract(f, f_path) #Extraction is done here, but where?
}
}
end
两个选项都不成功,请问有什么建议吗?
您的方法有一个参数 destination
,但从未使用过。
您的代码
f_path=File.join("destination_path", f.name)
定义一个名为 destination_path 的文件夹,后跟 zip 文件的路径。可能你想要参数 destination
.
的内容
与
FileUtils.mkdir_p(File.dirname(f_path))
您创建包含所有目录的目标路径(mkdir
只会创建一个目录,如果父目录不存在,您会得到一个错误)。
总结:试试这个代码:
require 'FileUtils'
require 'zip'
def unzip_file (file, destination)
Zip::File.open(file_path) { |zip_file|
zip_file.each { |f|
f_path=File.join(destination, f.name)
FileUtils.mkdir_p(File.dirname(f_path))
puts "Extract file to %s" % f_path
zip_file.extract(f, f_path)
}
}
end
您发表评论后:
要仅获取 zip 中的 txt 文件,您可以将 each
替换为 glob
:
require 'zip' #Already loads FileUtils
#~ require 'FileUtils'
def unzip_file (file_path, destination)
Zip::File.open(file_path) { |zip_file|
zip_file.glob('*.txt'){ |f|
f_path=File.join(destination, f.name)
FileUtils.mkdir_p(File.dirname(f_path))
puts "Extract file to %s" % f_path
zip_file.extract(f, f_path)
}
}
end
然后您可以为 Folder_A 中的每个 zip 文件调用该方法并定义目的地 Folder_B:
Dir['Folder_A/*.zip'].each{|zipfile|
unzip_file(zipfile, 'Folder_B')
}
之前已经有人问过关于这个主题的类似问题,但我无法解决。我有一批 .ZIP 文件,我只需要从中提取所有的 .TXT 文件,然后将它们移动到另一个位置。我试过这个:
unzip test.zip '*.txt' #This would only be useful for extracting one single .ZIP file, not for each one.
还有这个:
require 'FileUtils'
require 'zip'
def unzip_file (file, destination)
Zip::File.open(file_path) { |zip_file|
zip_file.each { |f|
f_path=File.join("destination_path", f.name)
FileUtils.mkdir_p(File.dirname(f_path)) #Don't quite understand this line
zip_file.extract(f, f_path) #Extraction is done here, but where?
}
}
end
两个选项都不成功,请问有什么建议吗?
您的方法有一个参数 destination
,但从未使用过。
您的代码
f_path=File.join("destination_path", f.name)
定义一个名为 destination_path 的文件夹,后跟 zip 文件的路径。可能你想要参数 destination
.
与
FileUtils.mkdir_p(File.dirname(f_path))
您创建包含所有目录的目标路径(mkdir
只会创建一个目录,如果父目录不存在,您会得到一个错误)。
总结:试试这个代码:
require 'FileUtils'
require 'zip'
def unzip_file (file, destination)
Zip::File.open(file_path) { |zip_file|
zip_file.each { |f|
f_path=File.join(destination, f.name)
FileUtils.mkdir_p(File.dirname(f_path))
puts "Extract file to %s" % f_path
zip_file.extract(f, f_path)
}
}
end
您发表评论后:
要仅获取 zip 中的 txt 文件,您可以将 each
替换为 glob
:
require 'zip' #Already loads FileUtils
#~ require 'FileUtils'
def unzip_file (file_path, destination)
Zip::File.open(file_path) { |zip_file|
zip_file.glob('*.txt'){ |f|
f_path=File.join(destination, f.name)
FileUtils.mkdir_p(File.dirname(f_path))
puts "Extract file to %s" % f_path
zip_file.extract(f, f_path)
}
}
end
然后您可以为 Folder_A 中的每个 zip 文件调用该方法并定义目的地 Folder_B:
Dir['Folder_A/*.zip'].each{|zipfile|
unzip_file(zipfile, 'Folder_B')
}