ループを使用して2つのディレクトリを検索し、重複ファイルを見つけて、2つのディレクトリのいずれかからそのファイルを削除します。

ループを使用して2つのディレクトリを検索し、重複ファイルを見つけて、2つのディレクトリのいずれかからそのファイルを削除します。

私はその中にいくつかのファイルを含む2つのディレクトリ(test1とtest2)を持っています。 bashを作成してこれらのディレクトリで重複したファイル名とファイルサイズを見つけ、それらのいずれかをディレクトリから削除するにはどうすればよいですか?

答え1

必要な操作を実行するコマンドは次のとおりです。

for f in test1/*; do find test2 -name $(basename $f) -size $(stat -c %s $f)c -delete; done

説明する:

  • for f in test1/*:test1の各ファイルを繰り返します。
  • $(basename $f):ループによって渡されたファイルのデフォルト名を返します。
  • $(stat -c %s $f): 繰り返されるファイルのサイズを返します。
  • cブロックの末尾にはstat出力がバイトで読み取られるようになっています。find
  • find test2 -name $(basename $f) -size $(stat -c %s $f)c -delete:一致するファイルを見つけて削除します。-delete

テスト実行の場合は、この-deleteフラグを無視してください。

注:組み込みstatコマンドはこのフラグをサポートしていないため、MacOSでは機能しません-c。代わりにstatのgnuバージョンをインストールしてください。

関連情報