4

任何人都知道一个命令行实用程序(或可以作为命令行运行的实用程序),它将目录树中的所有 .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 文件,因为我不想打扰系统处理器,而且大多数文件不会每天更改。这更像是文件同步。

4

3 回答 3

8

在 Windows 命令行中,您可以执行以下操作:

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

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

评论中的几点说明:

如果您的任何路径中可能有空格,则需要在第二个 %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 选项将文件的最后修改时间与目标中的时间进行比较,并且只复制较新的文件。

于 2009-05-13T16:56:08.600 回答
0

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

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

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

于 2009-05-13T16:34:52.957 回答
0

在 Unix 环境中,我会使用findor rsync(也许还有 shell 的一些特性)。Cygwin 和 MinGW 带有find,也许带有rsync. 您也可以在find某处获得独立的 Windows 端口。

如果SOURCEshell 变量是包含要复制文件的子目录的目录,并且DESTshell 变量是要将它们复制到的目录:

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

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

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

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

于 2009-05-13T17:06:54.947 回答