rsyncとfindの組み合わせ

rsyncとfindの組み合わせ

find&rsyncを使用してリモートコンピュータから特定のファイルをバックアップしようとしていますが、何も取得できません。

*state*設定は次のとおりです。 rsyncを使用して、リモートシステムまたは*srmリモートシステム上のすべてのファイルを含むバックアップをローカルディレクトリに作成したいと思います。リモートコンピュータでログイン資格情報を設定したくないので、リモートコンピュータ(不思議な場合はRetroPie)ではなくローカルコンピュータで実行したいと思います。 SSHキーを正しく設定しました。私の目標は〜/ retropie-backupにローカルにバックアップすることです。

私が使用しているfindコマンドはリモートシステムでうまく機能します(明確にするために1つの結果に切り捨てられます)。

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

今まではそんなに良くなった。また、ファイル名の空白についてパニックにならないように、rsyncに-sを追加する必要があることにも注意してください。しかし、2つを組み合わせる試みは機能しません。

$ 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リストを生成しますrsyncfind -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/

関連情報