最大のファイルを見つけて自動的に削除します

最大のファイルを見つけて自動的に削除します

最大のファイルを見つけるには、次のコマンドを実行します。

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またはの間に何かを挿入できます。例えばstatsort

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%nfind%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

おすすめ記事