rsync
私はいつも私のターゲットディレクトリに最新のN個のファイルだけを保持することを目指して(つまり、ある程度循環スキーム)以前にソートしてフィルタリングしたいリモートファイルディレクトリがますます増えています。rsync
これにはオプションがないようで、以下のように「任意のリモートコマンド挿入」技術を使用してきました。
https://stackoverflow.com/q/950062/787842
私はターゲットホストでcronとして実行する次のコマンドを思いつきました。
rsync -vrzO --delete \
-e ssh <remote_host>:'$(cd <remote_dir> && ls -t $PWD/* | head -n 25)' \
<destination_dir>
これは最初はうまく機能します(つまり、ターゲットディレクトリが空の場合)。最新の25ファイルのみがコピーされます。ただし、問題は、ウィンドウが「前方にスライドする」(つまり、新しいファイルが到着したときに古いファイルをローカルでプッシュする必要がある場合)、期待--delete
どおりにこのオプションが機能しないことです。私の考えでは、フィルタリングされたリモートファイルがまだ存在するため(つまり、'$(..)'
挿入されたコマンドによって一時的に隠されただけなので)、rsync
ローカルでフィルタリングする方法はありません。私の理解が正確でより良い方法はありますか?
ベストアンサー1
次のようにコマンドをシミュレートできます。
rsync -vrzO --delete -e ssh <remote_host>:'<remote_dir>/file1 <remote_dir>/file2' <destination_dir>/
これが置き換えられた出力ですcd <remote_dir> && ls -t $PWD/* | head -n 2
。
rsyncは--delete
ディレクトリですコマンドの置き換えファイルリストを提供します。だから--delete
動作しません。
抜粋man rsync
:
- 削除
これはrsyncに、受信側から不要なファイル(送信側にないファイル)を削除するように指示します。ただし、ディレクトリのみ 同期中です。あなた 完全なディレクトリを送信するには、rsyncに要求する必要があります。ディレクトリの内容( "dir / *"など)にワイルドカードを使用する代わりに( "dir"または "dir /"など)、ワイルドカードはシェルによって拡張されるため、rsyncは要求ではなく単一のファイル転送要求を受け取ります。ファイルの親ディレクトリについて。