结合 rsync 和 find

结合 rsync 和 find

我正在尝试使用 find & rsync 从远程计算机备份特定文件,但一无所获。

设置如下:我想使用 rsync 将包含远程计算机*state**srm远程计算机上的所有文件备份到本地目录中。我特别想从本地计算机运行它,而不是在远程计算机上运行它(RetroPie,如果你好奇的话),因为我不想从远程计算机设置登录凭据。我已经正确设置了 ssh 密钥。我的目标是在本地备份到 ~/retropie-backup 。

我正在使用的 find 命令在远程计算机上正常工作(为了清楚起见,被截断为一个结果):

$ find  -iname "*state*" -o -iname "*srm"
./RetroPie/roms/snes/EarthBound (USA).srm

到目前为止,一切都很好。我还知道我需要将 -s 添加到 rsync,这样它就不会因文件名中的空格而出现恐慌。然而,我尝试将两者结合起来并不起作用:

$ rsync -v -s pi@retropie:'`find  -iname "*state*" -o -iname "*srm"`' retropie-backup/
rsync: link_stat "/home/pi/`find  -iname "*state*" -o -iname "*srm"`" failed: No such file or directory (2)

我可以说我错过了一些基本的东西,但我只是没有看到它。有什么建议么?

答案1

有几种方法可以给这只猫剥皮

您可以使用另一个ssh调用来生成文件列表,并将其通过管道传输到您的rsync.此版本需要 GNU 扩展find -print0来处理可能包含空格、换行符或其他非打印字符的文件名。

ssh -nq pi find -type f \( -iname "*state*" -o -iname "*srm" \) -print0 |
    rsync --dry-run -aiv --from0 --files-from - pi@retropie: retropie-backup/

另一种方法是rsync直接仅包含这些文件。在这里,您需要包含所有目录,以便rsync下降到它们中,包含考虑的文件,然后排除其他所有内容。最后,您需要告诉rsync跳过最终没有内容的目录。

rsync --dry-run -aiv --include '*/' --include '*state*' --include '*srm' --exclude '*' --prune-empty-dirs pi@retropie: retropie-backup/

在这两种情况下,--dry-run一旦您确信选择了正确的文件集,请删除以执行该操作。

答案2

该程序find必须在远程计算机上运行,​​这看起来就像您正在尝试执行的操作,只是您的语法不正确。反引号只能在本地机器上运行命令。您必须ssh进入远程机器才能运行find

ssh pi@retropie find ... >./filelist
rsync -v -files-from ./filelist pi@retropie: retropie-backup/

相关内容