拡張子でグループ化された合計ファイルサイズを見つける方法


12

他の同僚と共有しているクラスターで作業しています。ハードディスクの容量は限られているため(場合によっては容量がいっぱいになっています)、パーツをときどき片付けます。これをすばやく実行したいので、これまでは、3か月以上前の100 MBを超えるファイルのリストを作成し、それでも必要かどうかを確認しています。

しかし、私は見逃している1000個を超える小さいファイルを含むフォルダーが存在する可能性があると考えているので、これが当てはまるかどうかを簡単に確認する方法を見つけたいと思います。私がデータを生成する方法から、拡張子ごとの合計サイズのリストを取得するのに役立ちます。この質問の文脈では、「拡張子」はファイル名の最後のドットの後ろにあるすべてのものです。

複数のファイルを含む複数のフォルダーがあるとします。

folder1/file1.bmp   40 kiB
folder1/file2.jpg   20 kiB
folder2/file3.bmp   30 kiB
folder2/file4.jpg    8 kiB

次のように、ファイル拡張子ごとの合計ファイルサイズのリストを作成することは可能ですか?

bmp 70 kiB
jpg 28 kiB

拡張子のないファイルは気にしないので、無視したり、1つのカテゴリに分類したりできます。

私はすでにのmanページを経てlsduそしてfind、私はこの仕事に適したツールであるかわかりません...


この質問は、codegolf.stackexchange.comではお見逃しなく :)
Doug McLean

@DougMcLean:そこに投稿できます。;)

回答:


16

GNUシステムの場合:

find . -name '?*.*' -type f -printf '%b.%f\0' |
  awk -F . -v RS='\0' '
    {s[$NF] += $1; n[$NF]++}
    END {for (e in s) printf "%15d %4d %s\n", s[e]*512, n[e], e}' |
  sort -n

またはと同じでperl-printfGNU の拡張を回避しますfind(まだGNU拡張を使用しています-print0が、これは現在、より広くサポートされています)。

find . -name '?*.*' -type f -print0 |
  perl -0ne '
    if (@s = stat$_){
      ($ext = $_) =~ s/.*\.//s;
      $s{$ext} += $s[12];
      $n{$ext}++;
    }
    END {
      for (sort{$s{$a} <=> $s{$b}} keys %s) {
        printf "%15d %4d %s\n",  $s{$_}<<9, $n{$_}, $_;
      }
    }'

次のような出力が得られます。

          12288    1 pnm
          16384    4 gif
         204800    2 ico
        1040384   17 jpg
        2752512   83 png

必要に応じてKiBMiB...接尾辞、にパイプしnumfmt --to=iec-i --suffix=Bます。

%b*512はディスク使用量を示しますが、ファイルが複数回ハードリンクされている場合、それらは数回カウントされるため、duレポートとの不一致が見られる場合があることに注意してください。


MacOSで失敗する(検索:-printf:プライマリまたはオペレーターが不明)
MichaelCodes

1
@MichaelCodes、はい-printf、GNU findに固有ですそのため、私はGNUシステムで言ったのです
ステファンChazelas

@ MichaelCodes、perlmacOSでも機能する代替手段で編集を参照してください。
ステファンChazelas

1,4,2,17とは何ですか?タイプごとのファイルの量は?
ホルヘコルネホベリド

3

ここに別の解決策があります:

find . -type f |  egrep -o "\.[a-zA-Z0-9]+$" | sort -u | xargs -I '%' find . -type f -name "*%" -exec du -ch {} + -exec echo % \; | egrep "^\.[a-zA-Z0-9]+$|total$" | uniq | paste - -

拡張機能を取得する部分は次のとおりです。

find . -type f |  egrep -o "\.[a-zA-Z0-9]+$" | sort -u

次に、拡張子が付いたファイルを検索して、画面に出力します。

xargs -I '%' find . -type f -name "*%" -exec du -ch {} + -exec echo % \;

次に、拡張子と合計を保持します。

egrep "^\.[a-zA-Z0-9]+$|total$" | uniq

同じ行に入れます:

paste - -

MacOSで動作します。
MichaelCodes

2

ステファンのソリューションほど良くはありませんが、あなたは試すことができます

find . -type f -name "*.png" -print0 | xargs -0r du -ch | tail -n1

ファイルのタイプごとにこれを実行する必要がある場所。


1
これは、1つのdu呼び出しだけが実行されるほど十分に少ないpngファイルがあることを前提としています。GNU xargsでは、-rファイルがないときにduが実行されないようにフラグを追加する必要があります(そうしないと、現在のディレクトリのディスク使用量が発生します)。を追加する-type f! type d、名前がで終わるディレクトリにあるファイルを数えないようにすることができます.png
ステファンChazelas

これは、1つの特定の拡張子のみを探します。
Rahul

それは私が書いたものです。「完全な」ソリューションを取得するには、適用可能なすべての拡張機能を反復するスクリプトでそれをラップする必要がありました。
カウンター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.