从目录树递归复制文件类型

MrD*_*Duk 1 ruby windows perl copy batch-file

我正在尝试找到一种方法将所有*.exe文件(以及更多,*.dtd,*.obj等)从目录结构复制到另一个路径.

例如,我可能有:

Code
   \classdirA
             \bin
                 \classA.exe
   \classdirB
             \bin
                 \classB.exe
   \classdirC
             \bin
                 \classC.exe
   \classdirD
             \bin
                 \classD.exe
Run Code Online (Sandbox Code Playgroud)

我想将所有*.exe文件复制到一个目录中,比如说c:\bins 最好的方法是什么?

我的系统的约束是:

  • 视窗
  • 可以是Perl,Ruby或.cmd

谁知道我应该在这看什么?

Aru*_*hit 5

只需在Ruby中使用方法Dir::glob:

# this will give you all the ".exe" files recursively from the directory "Code".
Dir.glob("c:/Code/**/*.exe") 
Run Code Online (Sandbox Code Playgroud)

** - 递归匹配所有目录.这用于下降到目录树并查找当前目录的子目录中的所有文件,而不仅仅是当前目录中的文件.在示例代码中探讨了此通配符.

* - 匹配零个或多个字符.只包含星号而没有其他字符或通配符的glob将匹配当前目录中的所有文件.星号通常与文件扩展名组合,如果不是更多字符,则缩小搜索范围.

好的博客使用Glob与目录.

现在要将文件复制到所需的目录,您需要查看方法FileUtils.cp_r:

require 'fileutils'
FileUtils.cp_r Dir.glob("c:/Code/**/*.exe"), "c:\\bins"
Run Code Online (Sandbox Code Playgroud)

我刚刚测试过FileUtils.cp,在这种情况下,该方法也可以使用:

require 'fileutils'
FileUtils.cp Dir.glob("c:/Code/**/*.exe"), "c:\\bins"
Run Code Online (Sandbox Code Playgroud)

我的偏好是使用::cp方法.因为Dir::glob实际上是.exe递归地收集所有具有扩展名的文件,并将它们作为数组返回.现在cp方法就足够了,现在只需从数组中取出每个文件并将其复制到目标文件.

为什么我不喜欢这种情况,方法::cp_r呢?

好的,我也在这里解释一下.正如方法名称所暗示的那样,它将递归地将所有文件从目录复制到目标目录.如果需要递归地复制特定文件,那么::cp_r就无法通过自己的能力来做到这一点(因为它不能自己做选择,这::glob可以做到).因此,在这种情况下,您必须为其提供特定的文件列表,然后将其复制到目标目录.如果这是唯一的任务,我必须做,然后我认为我们应该去::cp,而不是::cp_r.

希望我的解释有所帮助