rsyncを使用して無関係なファイルのみを削除する


13

2つのディレクトリ構造を比較し、ターゲットの場所にある無関係なファイルとディレクトリを削除する最良の方法は何ですか?

私が開発している小さなウェブフォトギャラリーアプリがあります。ユーザーはFTPを使用して画像を追加および削除します。私が書いたWebギャラリーソフトウェアは、その場で新しいサムネイルを作成しますが、削除は処理しません。私がしたいことは、コマンド/ bashスクリプトをスケジュールして、事前定義された間隔でこれを処理します。

元の画像は/home/gallery/images/サブディレクトリを使用してアルバムに保存され、アルバムに整理されます。サムネイルは/home/gallery/thumbs/、画像ディレクトリと同じディレクトリ構造とファイル名を使用してにキャッシュされます。

私はこれを達成するために以下を使用してみました:

rsync  -r --delete --ignore-existing /home/gallery/images /home/gallery/thumbs

すべてのサムネイルが既にキャッシュされている場合は正常に機能しますが、そうなるとサムディレクトリに元のフルサイズの画像がコピーされるという保証はありません。

私がやろうとしていることをどのように達成するのが最善ですか?

回答:


8

これにはrsync最善のアプローチではないと思います。次のようなbashワンライナーを使用します。

$ cd /home/gallery/thumbs && find . -type f | while read file;do if [ ! -f "../images/$file" ];then echo "$file";fi;done

この1行でファイルの正しいリストが生成された場合、rmコマンドの代わりにコマンドを実行するように変更できますecho


トムに感謝します。また、ディレクトリをクリーンアップする必要があると思います。もう一度実行する必要がありますが、ファイルの代わりにコマンドでディレクトリを指定し、エコーをrmdir?で置き換えます。
ブライアン

@ブライアン:はい、それは理にかなっています。findおよびの[テストでフラグを変更する必要があり]ます。もちろん、私があなたに与えたコマンドと修正の両方に非常に注意してください、そして徹底的にテストしてechoください!
トム・ショー

多くのおかげで、テスト中に大量のエコーを適用します。
ブライアン

1
考えてみました: "ls"でテストして、空白文字で適切に動作することを確認できます。ご多幸を祈る。
トム・ショー

34

あなたも必要です--existing

rsync -r --delete --existing --ignore-existing /home/gallery/images /home/gallery/thumbs

マンページから:

  --existing, --ignore-non-existing
          This tells rsync to skip creating files (including  directories)
          that  do  not  exist  yet on the destination.  If this option is
          combined with the --ignore-existing option,  no  files  will  be
          updated  (which  can  be  useful if all you want to do is delete
          extraneous files).

1
エラーがまったくある場合、すばらしい答えは機能しません。そのため、--ignore-errors引数も追加する必要があります。それは私のために働いた唯一のものです。ありがとう--existing--ignore-existingここでの答えの基礎としてあなたの答えを使いました
ロニーベスト

エラーは、いなくても存在する場合@LonnieBest rmcpまたはmvエラーが何であるかというのように動作します:彼らは見てしなければならないし、成功完了までの動作を妨げるという問題があります。あなたはエラーを無視するほとんどのツールに指示することができます(例えば-frm)が、それが問題か、この答えに関連するのですか私は表示されません。
メッキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.