ディレクトリ内の最も大きなファイルの一部を削除する

ディレクトリ内の最も大きなファイルの一部を削除する

ディレクトリ内の最も大きいファイルを特定数削除したいと思います。

最初の 10 個のファイル名を取得するには、次のようにします。

ls -S | head(または解析がより複雑ではあるものの、より豊富なものls -lS | head

これらを xargs 経由で rm に渡すにはどうすればいいでしょうか?

それでls -S | head | xargs rm動作しますか (スペースなどを含むファイル名でも)?

もっと良い/安全な方法はありますか?

申し訳ありませんが、失敗するのではないかと恐れて、これを自分でテストすることができませんでした (ディレクトリには、削除したくないものが含まれています)。

私はmacOSを使用しています。

答え1

それでls -S | head | xargs rm動作しますか (スペースなどを含むファイル名でも)?

いいえ。xargsデフォルトでは、 は改行だけでなく、空白文字で分割します。 では、すべての引数をスペースで区切って印刷する| xargs echoため、これを見ることはできません。( のようなものは、それらを改行で区切って印刷するため、ファイル名の途中で分割が発生したかどうかがわかります。)echo| xargs printf "%s\n"

少なくとも GNU xargs は-d '\n'改行でのみ分割する必要があり、xargs の多くのバージョンは-0NUL 文字 ( に付随find -print0) で分割する必要があります。少なくとも最初のものが必要になりますが、一般的なケースではファイル名に改行が含まれることもあり、その場合もheadあまり役に立ちません。

私はあなたに警告する義務がありますの出力を解析することlsは間違っていると考えられるどうやら、少なくともいくつかのバージョンでは、改行がなくても出力が壊れるようです。(ただし、改行や印刷できない文字がなければ安全かもしれません。多分。)

答え2

私は別のアプローチを使います。次のようなものです:

size=20000 # set a limit (in bytes), above these we will delete

for file in *
do
  [[ -f "$file" ]] || continue

  fileSize=$(stat --format "%s" "$file")

  if (( $fileSize > $size )) # if file is bigger than 20000 bytes
  then
    rm "$file" # delete the file
  fi          
done

この方法により、スペースを含むファイルを削除できるようになり、変数を使用して$size実際に「大きい」ファイルを決定できます。削除する前にプロンプ​​トを表示したい場合は、-iスイッチを使用します。rm -i

編集:
これを OS X で実行していることに今気付きました。現在、OS X を搭載したマシンにアクセスできないため、OS X ではstatサイズを取得するための形式が異なるというリスクがあるかもしれません。つまり、--format "%s"オプションが機能しない可能性があります。OS man statX で確認してください。

答え3

私はそう思います;

find . -type f -size +10M -delete -print

本当に ls の方法を採用したい場合は、おそらく;

ls -S | head -1 | while read af; do rm "$af"; done

答え4

使用翻訳ファイルをサイズ別(およびより頻繁に使用される日付別)に並べ替えて選択する方法があります。Zsh は OSX/macOS の標準インストールの一部ですが、他の Unix バリアントでは別途インストールする必要がある場合があります。

名前以外の基準でファイルを選択(および並べ替え)する方法はglob 修飾子たとえば、ディレクトリ内の最も大きい10個のファイルを一覧表示するには、を使用してOLサイズの降順で並べ替えます(l長さを指定して[1,10]最初の 10 個をリストします。

ls -ldU *(OL[1,10])

zsh を使わずにこれを行うのは、特に特殊文字を含むファイル名を処理する必要がある場合は、より複雑になります。ファイル名に印刷できない文字や改行が含まれていない限り、 の出力を解析できますls

ls -S | head -n 10 | while read -r filename; do echo rm -- "$filename"; done

関連情報