如何在另一个目录中的.ZIP文件中仅提取一种文件类型

时间:2016-03-17 19:59:51

标签: ruby zip

之前已经就此问题提出了类似的问题,但我无法解决这个问题。我有一批.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

这两个选项都没有成功,请你建议吗?

1 个答案:

答案 0 :(得分:1)

您的方法有参数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')
}