ディスク上の特定のフォルダとファイルの合計サイズを提供できるツールを探しています。順次処理される複数のフィルタパターンに基づいて、プロジェクトとすべてのサブアイテム(その中のフォルダとファイル)を明示的に含めるか除外できる必要があります。
たとえば、フィルタパターンは次のことができる必要があります。
- /bar(およびすべてのサブキー)と一致しますが、/foo/barは一致しません。
- /bar および /baz を除外せず、/foo (およびすべてのサブキー) のみを含めます。
- 無制限のレベルで作業してください。たとえば、/fooから.jpgを除外するには、/foo/cat.jpgと/foo/bar/dog.jpgを除外する必要があります。
私はこれを試しましたが、上記du
のすべてを行うことはできませんでした。
答え1
ツールが欲しいと思います。
- ファイルパスのパターンに基づいてファイルを選択
- サイズおよび/またはディスク使用量を検索して要約します。
もしそうなら質問があります。一部のファイルパスが同じファイルを参照している場合(一緒にハードリンクされている場合)はどうなりますか?同じファイルなので、サイズを一度だけ計算しますか?
ファイルを見つけるには、主なオプションは次のとおりです。
find
:標準コマンドですが、さまざまな標準のさまざまな実装と拡張があります。- シェルワイルドカード。 POSIXはこのユーティリティにワイルドカードを再割り当てします
sh
が、これは非常に制限的であり、一部のシェルではそれを拡張します。zsh
必要な機能を備えた「のみ」があります。
サイズおよび/またはディスク使用量を確認するには、次のオプションを使用してください。
du
しかし残念ながら、次の種類のファイルでは目次、ファイルのディスク使用量のみを提供することはできません。- GNU実装には、ディスク使用量またはサイズを印刷するように指示できる予測が
find
あります。-printf
stat
これを実行できるさまざまな互換性のないユーティリティの実装があります。興味深いことに、zsh
これにはランダムなファイルパスを確実に処理できる組み込み機能の1つがあり、おそらく唯一の機能です。
同じファイルを別のパスで識別するには、そのファイルを一意に識別する必要があるファイルのデバイス番号とinode番号を報告することもgfind -printf
できます。stat
合計を実行しbc
たり、awk
シェル算術を実行したりできます。
perl
、abdruby
などのプログラミング言語も、上記のすべてpython
の操作を比較的簡単に実行できます。
例:
LC_ALL=C find /foo ! -name '*.jpg' -printf '%D:%i %b\n' | awk '
! seen[$1]++ {sum += $2}
END {print sum * 512}
GNU 実装では、find
名前で終わらないファイルのディスク使用量を提供し、.jpg
複数のディレクトリに接続していても各ファイルを一度だけ計算します。
zsh
同じ
set -o extendedglob
zmodload zsh/stat
typeset -A du
for file (/foo/**/^*.jpg(NDoN)) {
stat -LH s -- $file &&
du[$s[device]:$s[inode]]=$s[blocks]
}
print $(( 512 * (${(j[+])du}) ))