内容が指定されたサイズより小さいディレクトリを削除するコマンド

内容が指定されたサイズより小さいディレクトリを削除するコマンド

~/fooサブディレクトリがあるディレクトリで作業しています。

~/foo/alpha
~/foo/beta
~/foo/epsilon
~/foo/gamma

~/foo各「レベル1」サブディレクトリの下の合計サイズを確認し、サイズが指定された値より小さい場合は、ディレクトリとその内容を削除するコマンドを実行したいと思います。

したがって、.より小さいコンテンツを削除したいとします50K$ du -sh */

8.0K alpha/
114M beta/
20K  epsilon/
1.2G gamma/

~/alpha私のコマンドでその内容とその内容を削除できるようにしたいです~/epsilon。そのようなコマンドがありますか?私はこれが何とかできると思いますfindが、どうなるかはよくわかりません。

答え1

GNUfindとGNUを使用coreutilsし、ディレクトリ名に改行がないとします。

find ~/foo -mindepth 1 -maxdepth 1 -type d -exec du -ks {} + | awk '$1 <= 50' | cut -f 2-

これにより、合計コンテンツが50K未満のディレクトリが一覧表示されます。結果に満足して削除するには、| xargs -d \\n rm -rfコマンドラインの最後に追加します。

答え2

GNU dusum実装を使用して任意のファイル名を処理するには、次のようにしますawkxargs

(
  cd ~/foo &&
    du --block-size=1 -l0d1 |
      awk -v RS='\0' -v ORS='\0' '
        $1 < 50*1024 && !/^[0-9]+\t\.$/ && sub("^[^\t]+\t", "")' |
      xargs -r0 echo rm -rf --)
)

それは:

  • ブロックサイズを指定します。それ以外の場合、duGNU が使用するブロックサイズは環境によって異なります。 1は最大精度を保証します(ディスク使用量をバイト単位で取得)。
  • NULで区切られたレコードを処理するために使用されます-0。 NULは、ファイルパスに見つからない唯一の文字です。
  • -d1深さが 1 以下のディレクトリに対してのみ累積ディスク使用量を取得します (深さ 0( .) は から除く!/^[0-9]\t\.$/) awk
  • -lファイルのディスク使用量が最初のディレクトリだけでなく、エントリとして見つかったすべてのディレクトリに対して計算されていることを確認してください。

実際にこれを行うには、削除echo(テスト実行)してください。

またはperl代わりに使用してくださいgawk

perl -0ne 'print $2 if m{(\d+)\t(.*)}s && $1 < 50<<10'

POSIXlyには次のものが必要です。

(
  unset -v BLOCK_SIZE BLOCKSIZE DU_BLOCKSIZE
  cd ~/foo &&
   LC_ALL=C POSIXLY_CORRECT=1 find . ! -name . -prune -type d -exec sh -c '
     for dir do
       du -s "$dir" | awk '{exit $1<50*1024/512 ? 41 : 0}'
       [ "$?" -eq 41 ] && echo rm -rf "$dir"
     done' sh {} +
)

unset -v BLOCK_SIZE BLOCKSIZE DU_BLOCKSIZEそしてPOSIXLY_CORRECT=1これは、GNUがduPOSIXが要求するようにブロックサイズとして512を使用していることを確認するためです。)

答え3

私はこれが少し古いことを知っていますが、これを行うために私自身の$ 0.02があり、それが他の人に役立つことを願っています。 GNU Parallel を使用すると、より良い並列パフォーマンスを実現できます。

find . -type d | parallel du -s {} | sort -h

これにより、PWD内のすべてのディレクトリのサイズがサイズでソートされて出力されます。逆順ソート:

find . -type d | parallel du -s {} | sort -hr

sort -hの過渡も機能しますdu -h

~  VirtualBox VMs  $  find . -type d | parallel du -sh {} | sort -h
4.0K    ./CentOS6/dir with spaces
4.0K    ./TFE79/Snapshots
8.0K    ./Desktop_default_1614944927311_69927/Logs
8.0K    ./Desktop_default_1614945289369_20675/Logs
12K     ./Desktop_default_1614944927311_69927
12K     ./Desktop_default_1614945289369_20675
96K     ./hello-world/Logs
108K    ./hello-world
160K    ./Knoppix/Logs
172K    ./Desktop_default_1627485664080_37244/Logs
172K    ./Knoppix
208K    ./CentOS6/Logs
228K    ./Flash/Logs
880K    ./TFE8/Logs
980K    ./TFE79/Logs
260M    ./NomadOS
411M    ./Desktop_default_1627485664080_37244/Snapshots
4.5G    ./CentOS6
6.6G    ./Flash
9.4G    ./TFE8/Snapshots
13G     ./TFE8
15G     ./Desktop_default_1627485664080_37244
18G     ./TFE79
56G     .

答え4

最初の答えはうまく機能しますが、スペースを含むディレクトリ名には機能しません。 (これは50Kb以上なので正しい論理です)

#RESULTTODELETE=$(find ~/foo -mindepth 1 -maxdepth 1 -type d -exec du -ks {} + | awk '$1 <= 50' | cut -f 2-); RESULTTODELETE2=$(echo "$RESULTTODELETE" | sed 's, ,\\ ,g'); echo "$RESULTTODELETE2" | xargs rm -rf

する:

~/f oo/a lpha
~/fo o/be ta
~/f o o/ep silon
~/foo/gamma

関連情報