2つのディレクトリ構造を比較し、ターゲットの場所にある不要なファイルとディレクトリを削除する最良の方法は何ですか?
開発中の小さなウェブフォトギャラリーアプリがあります。ユーザーはFTPを使用して画像を追加および削除します。私が作成したWebギャラリーソフトウェアは、その場で新しいサムネイルを作成しますが、削除を処理しません。私がやりたいのは、コマンド/ bashスクリプトをスケジュールして、これを事前定義された間隔で処理することです。
元の画像は/home/gallery/images/
に保存され、サブディレクトリを使用してアルバムに整理されます。サムネイルは/home/gallery/thumbs/
にキャッシュされ、imagesディレクトリと同じディレクトリ構造とファイル名を使用します。
これを達成するために以下を使用してみました:
rsync -r --delete --ignore-existing /home/gallery/images /home/gallery/thumbs
これは、すべてのサムネイルがすでにキャッシュされている場合は正常に機能しますが、これが当てはまるという保証はありません。これが発生すると、サムディレクトリに元のフルサイズの画像がコピーされます。
私がやろうとしていることを最もよく達成するにはどうすればよいですか?
rsync
がこれに最適なアプローチだとは思いません。次のようなbashワンライナーを使用します。
$ cd /home/gallery/thumbs && find . -type f | while read file;do if [ ! -f "../images/$file" ];then echo "$file";fi;done
このワンライナーがファイルの正しいリストを生成する場合、rm
コマンドの代わりにecho
コマンドを実行するように変更できます。
--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).