当我的查找结果仅显示文件时,为什么 rsync 会复制目录结构?

当我的查找结果仅显示文件时,为什么 rsync 会复制目录结构?

我拼凑了一个令人烦恼的复杂find命令,我将其通过管道传输,rsync目的是复制文件并同步新版本。我试图编写一个足够高效的命令来运行cron

find /home/archive/dir1/ -not -path '*/\.*' -ipath "/home/archive/dir1/*/*document-name*" -type f \( -iname "*.ods" -o -iname "*.pdf" \) -print0 | rsync -v --delete --files-from=- --from0 / /home/user/newdir2/

其想法是进入一个巨大的目录,提取document-name路径中包含文件名的文件。

问题是它不只是复制文件,它还递归复制所有目录结构,而我只是想要将返回的所有文件find收集到这个单独的目录中。

我得到了我想要的结果:

find /home/archive/dir1/ -not -path '*/\.*' -ipath "/home/archive/dir1/*/*document-name*" -type f \( -iname "*.ods" -o -iname "*.pdf" \) -exec rsync -avz --delete {} /home/user/newdir2/ \;

问题是,这会产生十亿个rsync实例来执行单个文件列表应该执行的操作,这可能不太好cron

即,这个:

/home/archive/dir1/New1/New1 document-name.ods
/home/archive/dir1/New2/New2 document-name.pdf
/home/archive/dir1/New3/new3-DOCUMENT-NAME.ods
...
/home/archive/dir1/New9234/New9234-document-name.ods

变成:

/home/user/newdir2/New1 document-name.ods
/home/user/newdir2/New2 document-name.pdf
/home/user/newdir2/new3-DOCUMENT-NAME.ods
...
/home/user/newdir2/New9234-document-name.ods

欢迎提出任何关于改进我的命令的建议。

我曾尝试在 rsync 中使用排除,但我不认为这是正确的解决方案。

我怎么能够有效率的同步所有这些文件吗?

答案1

我认为没有比查找文件并执行单个 rsync 实例更有效的方法了。任何将文件列表导入 rsync 的尝试都将导致维护目录结构。

一个替代方法(如果你可以限制查找模式)是使用:

rsync -d --delete --include=*.pdf --include=*.ods --exclude=* /home/ms/archive/dir1/**/. /home/ms/newdir2/.

这将把所有 (子) 目录中的 pdf/ods 文件与文件夹 /home/ms/newdir2/ 同步,而无需在单个 rsync 结构中维护目录。

您给出的示例(如果是 document-name 或 DOCUMENT-NAME)可以通过以下方式解决:

rsync -d --delete --include=*document-name.pdf --include=*DOCUMENT-NAME.pdf --include=*DOCUMENT-NAME.ods --include=*document-name.ods --include=*DOCUMENT-NAME.pdf --exclude=* /home/ms/archive/dir1/**/. /home/ms/newdir2/.

相关内容