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

时间:2014-02-27 19:25:49

标签: ruby windows perl batch-file copy

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

例如我可能有:

Code
   \classdirA
             \bin
                 \classA.exe
   \classdirB
             \bin
                 \classB.exe
   \classdirC
             \bin
                 \classC.exe
   \classdirD
             \bin
                 \classD.exe

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

我系统的约束是:

  • 可以是Perl,Ruby或.cmd

任何人都知道我应该在这看什么?

3 个答案:

答案 0 :(得分:5)

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

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

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

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

好的博客Using Glob with Directories

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

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

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

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

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

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

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

希望我的解释有所帮助。

答案 1 :(得分:2)

cmd命令行

for /r "c:\code" %f in (*.exe) do copy "%~ff" "c:\bins"

要在批处理文件中使用,请将百分号加倍(%%而不是%

答案 2 :(得分:1)

Windows shell(cmd)命令:

for /r code %q in (*.exe) do copy "%q" c:\bin

如果将%字符放在批处理文件中,请加倍。