将 Rsync 与 Find 结合使用

将 Rsync 与 Find 结合使用

我正在尝试编写一个脚本,该脚本将复制过去 24 小时内创建的文件并且属于特定文件类型 (*.png)。

我尝试过的命令是:

rsync -avz --ignore-existing --include='*.png' --exclude='*' \
 --files-from=<(ssh user@remote1 'find /home/admin/Backup/ -mtime -1 -type f -exec basename {} \;') \
  user@remote1:/home/admin/Backup/ /Repository/

这适用于备份目录中的 *.png 文件,但是当文件位于两个或三个文件夹深度时,该命令将失败,即位于/home/admin/Backup/folder1/folder2/我得到的错误是

link_stat '/home/admin/Backup/example.png' failed: No such file or directory (2)

那是因为basename {}当它返回结果到 时, 正在砍掉该位置rsync。所以我尝试删除basename {},我得到了这个:

link_stat '/home/admin/Backup/home/admin/Backup/folder1/folder2/example.png' failed: No such file or directory (2)

就像rsync附加源目录一样,我不知道如何修复它。有人知道如何解决这个问题,或者我可能只是以错误的方式从远程服务器上拉取这个文件?

答案1

man rsync说的是--files-from

  The  filenames  that  are read from the FILE are all relative to
  the source dir -- any leading slashes are removed  and  no  ".."
  references  are  allowed  to go higher than the source dir.  

因此,尝试通过相对方式输出路径find

rsync -avz ... --files-from=<(ssh user@remote1 'cd /home/admin/Backup/; find . -mtime -1 -type f -name "*.png")

或者find /home/... ... -printf "%P\n",自从%PGNUfind是:

文件的名称以及在其下发现该文件的命令行参数的名称已被删除。

我冒昧地添加了,-name "*.png"因为我不明白为什么应该在有能力并且已经被使用的rsync情况下进行过滤。find

相关内容