我拼凑了一个令人烦恼的复杂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/.