bash 脚本中的 rsync 命令使用 --from-files 给出 rsync: link_stat 错误

bash 脚本中的 rsync 命令使用 --from-files 给出 rsync: link_stat 错误

我经常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:

所以,我在这里建议两件事:

  1. 用于\0分隔报告的路径名find(这是仅有的在 Unix 系统上可以安全地用于分隔路径名的字符,因为路径名中允许换行符)。
  2. 报告应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.

概括:

  1. 不要运行basename找到的文件find。相反,从远程系统获取它们的完整路径并--no-relative与 一起使用rsync
  2. 确保未打印远程主机的欢迎横幅。

相关内容