web-dev-qa-db-ja.com

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

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

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

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

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

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

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

私がやろうとしていることを最もよく達成するにはどうすればよいですか?

13
Bryan

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

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

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

8
Tom Shaw

--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).
34
Joril