【问题标题】:How to get the specific files in pattern-matching directory Ruby如何获取模式匹配目录Ruby中的特定文件
【发布时间】:2017-06-12 02:35:36
【问题描述】:

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

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

"./file/drive_Temp/**/tools/"

可以是:

  • ./file/drive_Temp/abc/tools/
  • ./file/drive_Temp/def/tools/
  • ./file/drive_Temp/xyz/tools/

只要前面部分以“./file/drive_Temp/”开头,以“/tools/”结尾。


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

以下目录中可能有一些文件,例如:

  • ./file/drive_Temp/abc/tools/aaa.txt
  • ./file/drive_Temp/abc/tools/bbb.txt
  • ./file/drive_Temp/abc/tools/ccc.txt
  • ./file/drive_Temp/def/tools/zzz.txt
  • ./file/drive_Temp/def/tools/yyy.txt
  • ./file/drive_Temp/def/tools/qqq.txt
  • ./file/drive_Temp/xyz/tools/ttt.txt
  • ./file/drive_Temp/xyz/tools/jjj.txt

那些 txt 文件将被移动到名为 Tools 的目录

这是我的代码:

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

双星号不起作用吗?因为文件夹无法移动到指定的目录。还是应该改用glob

【问题讨论】:

  • 我觉得你的逻辑有点不对劲。即使 mv 命令可以工作,在 ./file/drive_Temp/abc/ 下的“工具”目录的第一个副本之后,该命令也会将 ./file/drive_Temp/def/ 作为“工具”目录抛出错误已经存在了。请告知您要实现的目标是什么?
  • 我已对我的问题进行了更改。我想检查文件夹是否存在,然后将目录中的文件移动到提供的新目录
  • 无需检查现有文件夹,您可以使用Dir 并直接抓取与该模式匹配的文件夹中的文件。检查发布的答案。

标签: ruby directory glob fileutils


【解决方案1】:

您可以使用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

【讨论】:

  • @grail file 将覆盖目标目录中的那个(即./Tools)。
  • @grail 感谢您指出这一点,即使 OP 没有明确要求,它也是相关信息,应在答案中注明和考虑(至少作为替代方案)。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
相关资源
最近更新 更多