我经常rsync:link stat error
说该目录不存在,然后它最终会复制远程服务器文件夹中的所有文件,而不是少于命令中指定时间的文件find
。不确定是否是间距问题或如何bash
解释括号。请注意,有时它可以正常工作。
命令:
rsync --no-perms --ignore-existing -vt --files-from=<(ssh admin@rig700 'find /usr/bin/rig/cache -mmin -720 -type f -exec basename {} \;') admin@rig700:/usr/bin/rig/cache /usr/bin/rig/store
答案1
您显式调用basename
找到的每个文件find
,即使它们是在 下的子目录中找到的/usr/bin/rig/cache
。这意味着类似的文件将/usr/bin/rig/cache/subdir/myfile
被报告myfile
为--files-from=
.rsync
该文件显然不存在于 中/usr/bin/rig/cache
,因此我希望rsync
对此进行投诉。
你可以做的是使用-print0
而不是-exec basename {} \;
with find
,这会给满的所有找到的文件的路径,由\0
(nul) 字符分隔。然后使用--files-from=
此结果,并使用它--from0
来指定它是一个以 null 分隔的路径名列表。
rsync
然后,使用作为 的源路径admin@rig700:
。
所以,我在这里建议两件事:
- 用于
\0
分隔报告的路径名find
(这是仅有的在 Unix 系统上可以安全地用于分隔路径名的字符,因为路径名中允许换行符)。 - 报告应
find
复制的文件的完整路径名,然后将这些路径按原样与rsync
.
最后,你的命令是
rsync -e 'ssh -q' --no-perms --ignore-existing -vt \
--from0 --files-from=<(
ssh -q admin@rig700 'find /usr/bin/rig/cache -mmin -720 -type f -print0'
) --no-relative admin@rig700: /usr/bin/rig/store
--no-relative
需要(或)选项--no-R
,以便将通过读取的路径名--files-from
视为绝对路径名。如果没有此选项,路径名(例如)的/usr/bin/rig/cache/somefile.txt
首字母将被/
删除并相对于远程主机上的主目录。
我还使用过ssh -q
,既可以find
在远程系统上执行命令,也可以使用的-e
( --rsh
) 选项rsync
。我这样做是因为您的远程主机似乎会打印欢迎横幅。这个横幅令人困惑rsync
,因此我们必须禁用它的打印,无论是执行命令find
还是rsync
.
概括:
- 不要运行
basename
找到的文件find
。相反,从远程系统获取它们的完整路径并--no-relative
与 一起使用rsync
。 - 确保未打印远程主机的欢迎横幅。