Linux で各サブディレクトリの最大のファイルを保持したまま、すべてのサブディレクトリ内のすべてのファイルを削除するにはどうすればよいでしょうか?

Linux で各サブディレクトリの最大のファイルを保持したまま、すべてのサブディレクトリ内のすべてのファイルを削除するにはどうすればよいでしょうか?

これは私の最初の質問です。質問を許可していただき、また私の質問を読んでいただきありがとうございます。

私は Ubuntu 22.04 で GNOME Shell と bash シェルを使用しています。800 を超えるサブディレクトリを持つフォルダがあります。各サブディレクトリには、解像度の異なる同じビデオの 4 ~ 8 つのバージョンが含まれています。各ビデオ/サブディレクトリでは、最高の解像度のみを保持したいと考えています。

各サブディレクトリ内の最大のファイルのみを残して、すべてのサブディレクトリ内のすべてのファイルを再帰的に削除するにはどうすればよいですか?

答え1

申し訳ありませんが、スクリプトを書くつもりはありませんが、使用できるアルゴリズムの 1 つを次に示します。(以下ではスクリプト要素を使用していますが、正確なスクリプトとはほど遠く、単にコマンドを挿入しようとすると悲惨な結果になる可能性があります)

これらを行う前に、ディレクトリ構造全体を別のディスクにコピーして、スクリプトを実行する前にテストし、誤ってファイルを削除して回復できないことがないようにすることを強くお勧めします。

  1. トップディレクトリから、fldrLst='find ./ -type d'(左のチェックマークにはシングルクォーテーションを使用しています)
  2. トップディレクトリから、$fldrLst次の操作をループしながら 実行します。
    • 単一のディレクトリ リーフからファイル サイズの降順でファイルのリストを取得します。fileLst='find $fldrList[n] -type f -maxdepth 1 -exec ls -al {} \; | sort k 5 -nr'[n]リスト配列の特定のメンバーです。
    • ディレクトリリーフ内のファイルを数える:echo $fildLst | wc -l
    • 最初のエントリ(最大のファイル)の後の各ファイルを削除します。ループして$fileLst削除しますrm $fileList[n](最初のエントリはn配列の 2 番目のエントリです)。

これにより、タスクを達成するための正しい軌道に乗ることができるはずです。


この回答が解決策を見つけるのに役立つ場合は、必ず回答としてマークするか、部分的な解決策として賛成票を投じてください。

答え2

linux - 最大のファイルを除くすべてのファイルを削除する - スーパーユーザー

テストバージョンでは、削除されるファイルのみが ls されます:

find -type d -exec sh -c 'find "$0" -maxdepth 1 -mindepth 1 -type f -exec stat --printf "%s %n\0" \{\} + | sort -znr | tail -zn +2' {} \; | cut -zf 2- -d " " | xargs -0r ls -l

動作バージョンでは、ファイルが削除されます:

find -type d -exec sh -c 'find "$0" -maxdepth 1 -mindepth 1 -type f -exec stat --printf "%s %n\0" \{\} + | sort -znr | tail -zn +2' {} \; | cut -zf 2- -d " " | xargs -0r rm

オリジナルコードカミル・マチョロフスキ

関連情報