ディレクトリから最大のファイルの一部を削除します。

ディレクトリから最大のファイルの一部を削除します。

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

以下を使用して上位10個のファイル名を取得できます。

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

rmにどのように渡すのですか? xargsを介して?

それで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がインストールされているコンピュータにアクセスできません。statOS Xからサイズを取得するために他の形式がある危険性があります。つまり、この--format "%s"オプションは機能しない可能性があります。 OS Xをチェックしてみてくださいman stat

答え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バリアントでは別々にインストールする必要があるかもしれません。

名前以外の基準を使用してファイルを選択(およびソート)する方法は次のとおりです。グローバル予選。たとえば、ディレクトリ内の最大10個のファイルを一覧表示するには、サイズの降順に並べ替えOLength)[1,10]上位10個を一覧表示します。

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

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

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

関連情報