如何在模式匹配目录Ruby

时间:2017-06-12 02:35:37

标签: ruby directory glob fileutils

我想编写一个Ruby脚本,可以查找来自同一模式的目录,然后将文件夹和文件复制到另一个目录中。

例如,如果我想找到一个目录模式:

  

“./文件/ drive_Temp / ** /工具/”

可以是:

  • ./文件/ drive_Temp / ABC /工具/
  • ./文件/ drive_Temp / DEF /工具/
  • ./文件/ drive_Temp / XYZ /工具/

只要前面部分以“./file/drive_Temp/”开头并以“/ tools /".

结尾

我想要做的是将符合所述目录模式的所有文件复制到新目录:

以下目录中可能包含以下文件:

  • ./文件/ drive_Temp / ABC /工具/ aaa.txt
  • ./文件/ drive_Temp / ABC /工具/ bbb.txt
  • ./文件/ drive_Temp / ABC /工具/ ccc.txt
  • ./文件/ drive_Temp / DEF /工具/ zzz.txt
  • ./文件/ drive_Temp / DEF /工具/ yyy.txt
  • ./文件/ drive_Temp / DEF /工具/ qqq.txt
  • ./文件/ drive_Temp / XYZ /工具/ ttt.txt
  • ./文件/ drive_Temp / XYZ /工具/ jjj.txt

这些txt文件将移动到名为Tools

的目录

这是我的代码:

if File.directory?('./file/drive_Temp/**/tools')
    FileUtils.mv './file/drive_Temp/**/tools/*.*','./Tools'
end

双星号不起作用吗?因为该文件夹无法移动到指定的目录。或者我应该使用glob代替吗?

1 个答案:

答案 0 :(得分:2)

您可以使用Dir获取这些目录中的所有文件,并迭代移动每个文件,如下所示:

Dir["./file/drive_Temp/**/tools/*"].each do |file|
  FileUtils.mv(file, './Tools')
end

请注意,这将替换 ./Tools中已存在的所有文件;如果需要避免这种行为,那么您可以在移动之前检查要移动的文件是否已存在于.Tools中,例如:

target_dir = "./Tools"

Dir["./file/drive_Temp/**/tools/*"].each do |file|
  if File.exist?("#{target_dir}/#{File.basename(file)}")
    # Handle file with duplicate name.
  else
    FileUtils.mv(file, target_dir)
  end
end