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

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

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

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

答え2

最新のGNUツールを使用してください(すでにGNU固有のオプションを使用しています):

du -S0 . |sort -zrn | sed -z 's@[^/]*@.@;5q' | xargs -r0 echo rm -rf

(満足したら削除してくださいecho)。

/は、任意の名前でファイル/ディレクトリをコピーできること-0です。-z

ほとんどのrm実装では(現在の作業ディレクトリ)削除を拒否するため、.より高いレベルでこれを実行して次のことを行う必要があります。

du -S0 dir | sort -zrn | sed -z 's@\s*\d+\s*@@;5q' | xargs -r0 echo rm -rf

したがって、このファイルが最大のファイルの1つである場合は削除できますdir(すべてのサブディレクトリも削除されます)。あなたの要求として見ると、これが実際にあなたが望むものであるかどうかはわかりません。

今最大5つだけ削除したい場合定期的なファイル(ディレクトリ、デバイス、シンボリックリンクなどの他の種類のファイルは含まれていません)には、以下を使用できますzsh

echo rm -f ./**/*(D.OL[1,5])

OL長さの逆順(ディスク使用量ではないサイズ))。

答え3

これには、各ファイルの(サブシェル集中)ループがあります。echormコマンドで置き換えます。

du -Sh /your/search/path/ |\
sort -rh |\
head -5 |\
awk '{print $2}' |\
while read file ; do
  echo "$file"
done

実際のbashで動作します。しかし、これは確かに良いスクリプトではありません。ファイル名の空白のためにいくつかのコメントを受け取ることができると確信しています。 ;) ようこそ!

クローンの操作に慣れている場合は、このスクリプトを定期的に実行してください。

答え4

ここに簡単な答えがあります。役に立つことを願っています。 'find/-type f -size 1G -exec rm{}\;'これにより、ルートディレクトリでサイズが1Gを超えるすべてのファイル(ディレクトリではない)を見つけて削除します。たとえば、名前でファイルを選択する必要がある場合は、execの後にファイルの並べ替えを追加できます。サイズはM(メガバイト)、k(キロバイト)、c(バイト)に変更できます。見つけなければならないオプションがたくさんあります。これは強力なコマンドです。マニュアルページを確認してください! :)

関連情報