【问题标题】:Copy a directory tree to a single directory at a command line在命令行中将目录树复制到单个目录
【发布时间】:2009-05-13 16:22:16
【问题描述】:

任何人都知道一个命令行实用程序(或可以作为命令行运行的),它将目录树中的所有 .jpg 文件收集到一个文件夹中,只复制更改的文件?

我从Renamer 开始,这对于重命名当前目录中的文件非常有用,但是当我尝试破坏路径时却失败了。这可能是因为我不太了解 Renamer。我最终创建了一个文本文件目录转储,然后使用 REGEX 查找/替换来创建批处理文件,但这既不高效也不自动化。

正则表达式:

(G:\DIR\DIR\)([0-9]+\)([0-9]+\)([0-9]+\)([0-9]+\)(p [0-9]+.jpg)

改变了这个

G:\DIR\DIR\00\00\00\00\p0000000000.jpg

到这里

G:\DIR\DIR\p0000000000.jpg

(复制\1\2\3\4\5\6 \1\6)到批处理文件中。

我需要在没有真人登录的情况下将整个事情作为计划任务运行。不是真的在寻找 Zip 文件,因为我不想打扰系统处理器,而且大多数文件不会从一天开始改变今天。这更像是文件同步。

【问题讨论】:

  • 您是否介意调整问题,因为它实际上不符合您的帖子意图。我真的在寻求帮助以在 Windows 命令行上搜索“windows 复制树”递归复制文件夹,并且由于标题,您的帖子被认为是最佳匹配,尽管这绝对是一个更具体的问题......对于那些到这里寻找解决方案的人对于这样的复制树:使用xcopy /s /i srcdir dstdir ...

标签: windows regex command-line file-rename


【解决方案1】:

在 Windows 命令行中,您可以这样做:

for /R A %i IN (*.jpg) DO xcopy %i B /M /Y

其中 A 是源目录,B 是目标目录。您需要启用命令扩展,我相信这是默认设置。

来自 cmets 的一些笔记:

如果您的任何路径中可能包含空格,则需要在第二个 %i 周围添加引号。这可以防止字符串被 xcopy 命令解释为两个单独的参数。您可能需要围绕 A 和 B 路径执行相同的操作。像这样:

for /R "A" %%i IN (*.jpg) DO xcopy "%%i" "B" /M /Y

如果您将其放在 .bat 或 .cmd 文件中,则需要像这样将百分比加倍。

for /R A %%i IN (*.jpg) DO xcopy %%i B /M /Y

xcopy 上的 /M 选项只会复制设置了存档位的文件,然后取消设置该位。这可以防止文件被复制两次。如果您有其他进程也更改此位,则可能会导致问题。也可以使用 /D 选项将文件的最后修改时间与目标文件的最后修改时间进行比较,并仅复制较新的文件。

【讨论】:

  • 这是否只复制更改的文件?这似乎是棘手的部分。
  • @Dennis Palmer - 在我的编辑中,我使用 /M 将副本更改为 xcopy。 /M 仅复制具有归档属性集的文件,并从原始文件中删除归档属性。当文件更改时,Windows 应重新应用归档属性。
  • 你为什么在这里使用/M?是否会在末尾添加 /D 以仅复制源时间比目标时间新的文件?
  • 好的,你在我研究的时候回复了。凉爽的!赞成的答案。
  • 我在一个 DOS 批处理文件中实现了这一点,发现需要进行一些更改。 (1) 在批处理文件中,与命令行相比,您必须在“%i”中添加一个额外的百分号,使其成为“%%i”。 (2) 我必须在 %%i 周围加上双引号,否则对于任何带有空格的文件名都会失败。请注意,如果 A 和 B 的目录名称包含空格,则还需要将双引号括起来。
【解决方案2】:

从路径格式我猜你是在 Windows 上。

我还没有阅读完整的内容,但http://www.infionline.net/~wtnewton/batch/batguide.html#6a 可能会对你有所帮助。

同一页面有 dizzy.bat, (http://www.infionline.net/~wtnewton/batch/dizzy.bat) 应该很容易编辑来做你想做的事。

【讨论】:

    【解决方案3】:

    在 Unix 环境中,我会使用 findrsync(可能还有一些 shell 功能)。 Cygwin 和 MinGW 带有 find,可能带有 rsync。您还可以在某处获得用于 Windows 的独立端口 find

    如果SOURCE shell 变量是包含要复制文件的子目录的目录,而DEST shell 变量是要将它们复制到的目录:

    find $SOURCE -name \*.jpg -exec cp --update \{\} $DEST/ \;
    

    find 本质上是递归的。 “-name \*.jpg”选择与该模式匹配的文件。您可以使用 -and 添加其他条件。 cp 命令(或 -u)的 --update 选项仅在更改或尚未复制文件时才会复制文件。 cp 的其他选项也可能有用。

    如果 $SOURCE 与您的 DIR/DIR/ 示例中的 $DEST 相同,则 find 还将找到目标文件(已复制),尽管这没问题,cp 会识别出您正在尝试复制同一个文件并跳过它,但如果你想避免浪费工作,你可以使用“for”和“if”(或其他东西)只在 DIR/DIR/ 的子目录上运行 find。

    您还可以使用 rsync,它具有可以从目标目录中删除文件(如果它们也已从源目录中删除)以及许多其他此类变体的选项。

    【讨论】:

      猜你喜欢
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 2016-10-09
      • 2017-11-11
      • 2012-01-22
      • 2013-10-24
      相关资源
      最近更新 更多