最大のファイルを見つけるには、次のコマンドを実行します。
du -Sh | sort -rh | head -5
だから私はそうしました-rm rf someFile
。
前のコマンドで見つかったファイルを自動的に削除する方法はありますか?
ベストアンサー1
Linuxの標準であるGNUツールを使用している場合は、次のことができます。
stat --printf '%s\t%n\0' ./* |
sort -z -rn |
head -z -n 5 |
cut -z -f 2- |
xargs -0 -r echo rm -f --
(テスト後「エコー」を削除しました)。
このstat
コマンドは、現在のディレクトリにある各ファイルのファイルサイズと名前をタブで区切って印刷し、各レコードはNUL(\ 0)バイトで終わります。
このsort
コマンドは、NUL で終わる各レコードを逆順にソートします。このhead
コマンドは最初の5つのレコードのみを一覧表示し、各cut
レコードからファイルサイズフィールドを削除します。
最後に、対応するxargs
(まだNUL終了)入力を取得し、パラメータとして使用しますecho rm -f
。
レコード(ファイル名)ターミネータとしてNULを使用するため、有効な文字を含むファイル名を処理できます。
最小ファイルサイズが必要な場合、awk
またはの間に何かを挿入できます。例えばstat
sort
stat --printf '%s\t%n\0' ./* |
awk 'BEGIN {ORS = RS = "\0" } ; $1 > 25000000' |
sort -z -rn | ...
注:GNUにはNUL終了レコードのオプションはawk
ありません-z
が、レコード区切り文字を必要に応じて設定できます。出力レコード区切り記号(ORS)と入力レコード区切り記号(RS)をNULに設定する必要があります。
find
以下は、明示的に自分自身を制限する別のバージョンです。一般ファイル(たとえば、ディレクトリ、名前付きパイプ、ソケットなどを除く)指定されたディレクトリ(サブディレクトリ-maxdepth 1
なし)でのみサイズが25Mより大きい(必須ではありませんawk
)。
stat
このバージョンにはGNUにも対応する機能がfind
あるため、このバージョンは必要ありません。printf
ところで、stat
。%n
find
%p
find . -maxdepth 1 -type f -size +25M -printf '%s\t%p\0' |
sort -z -rn |
head -z -n 5 |
cut -z -f 2- |
xargs -0 -r echo rm -f --
他のディレクトリに対して実行するには、.
findコマンドを置き換えます。例えばfind /home/web/ ....
シェルスクリプトバージョン:
#!/bin/sh
for d in "$@" ; do
find "$d" -maxdepth 1 -type f -size +25M -printf '%s\t%p\0' |
sort -z -rn |
head -z -n 5 |
cut -z -f 2- |
xargs -0 -r echo rm -f --
done
たとえば、パスのどこかに保存してdelete-five-largest.sh
実行します。delete-five-largest.sh /home/web /another/directory /and/yet/another
が実行されますfind ...
ディレクトリごとに1回コマンドラインで指定されます。これはいいえ複数のパス引数を使用して一度実行するのと同じです(スクリプトにループがないfind
ようです)。各ディレクトリから最大5つのファイルを削除し、forループなしで実行すると、すべてのディレクトリを検索したときに見つかった最大5つのファイルのみが削除されます。これはディレクトリごとに5つ、合計5つです。find "$@" ...
for