【问题标题】:"cp --parents" in batch file/VBScript批处理文件/VBScript 中的“cp --parents”
【发布时间】:2009-09-17 15:28:07
【问题描述】:

如果在 Windows 环境中只有批处理文件和 VBScript 可供您使用,您将如何编写此代码?

find -name '*.ext' -exec cp --parents {} destination/ \;

或者这样说:

  • 递归地在当前文件夹中查找某些文件名模式(在上面的示例中以名为 ext 的扩展名结尾),
  • 将这些文件中的每一个复制到目标文件夹(无论在哪里),并保留当前文件夹中的目录树结构(或创建任何缺少的中间目录)。

【问题讨论】:

    标签: bash vbscript copy batch-file parents


    【解决方案1】:

    这应该可行:

    for /r %%a in (*.cmd) do xcopy %%a C:\DESTINATION%%~pa
    

    注意DESTINATION 应该永远 是您尝试从中复制的目录的子目录,否则for /r 进入递归循环复制它已经复制的文件创建越来越长的目录路径(不要问我是怎么知道的)。

    您可以使用xcopy /c 使其更加健壮(即使发生错误也可以继续复制)。您可能还想查看xcopy /?,看看那里是否还有其他有价值的东西(/q/r/o 等)。

    【讨论】:

    • 一旦路径达到 32k 个字符,它最终会停止 :-)
    • +1 就像一个魅力,格兰特!只有白痴才会在目的地放一个循环引用,对吧?哈哈。
    • 它工作得很好(几乎在那里),谢谢格兰特!但是在destination中创建的目录树结构实际上是文件的绝对路径。有没有办法为此只创建相对路径?
    • @exalted:如果您需要的是从当前目录到新位置的相对目录,保留路径,那么 [mjv's answer][stackoverflow.com/questions/1439588/1439636#1439636]xcopy /s *.cmd C:\DESTINATION 应该只要您工作在源目录中运行它。如果你从另一个目录xcopy /s [source_dir]\*.cmd C:\DESTINATION 运行它,你会得到C:\DESTINATION\[source_dir]\directories_and_files
    【解决方案2】:

    编辑: 我的错,我错过了 cp 命令中的 --parents 标志...如下所示的 xcopy 只会重新创建向下路径,而不是当前目录“上方”的目录。

    我 [现在] 相信 xcopy [不会] [独自一人。但与格兰特瓦格纳的“for /r”技巧相得益彰]。

    xcopy [some_path]*.ext [some_otherpath]\final_directory /E  
    
     (or /S, above, if you don't want empty directories)
     the elements within brackets, some_path and some_otherpath are optional
    

    【讨论】:

    • 请问精确到什么程度?我尝试过使用 /t 和 /i 选项,但没有成功。
    • /T 仅创建目录结构但不复制任何内容,而 /I 只是更改目标的语义。我怀疑你会想要/S 标志。所以类似于xcopy *.ext destination /S
    • /s 会从上到下工作,不是吗?我只需要复制具有给定模式及其目录树结构的文件。这正是 bash 命令的作用。为了更好地理解这一点,想象一下当前文件夹中有数千种不同的文件,但您只需要那些特定的文件。
    猜你喜欢
    • 2015-05-12
    • 2011-01-07
    • 2012-08-07
    • 2015-04-19
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 2020-12-24
    相关资源
    最近更新 更多