我正在尝试使用 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/