包含パターンと除外パターンを持つ特定のフォルダ/ファイルの合計サイズ

包含パターンと除外パターンを持つ特定のフォルダ/ファイルの合計サイズ

ディスク上の特定のフォルダとファイルの合計サイズを提供できるツールを探しています。順次処理される複数のフィルタパターンに基づいて、プロジェクトとすべてのサブアイテム(その中のフォルダとファイル)を明示的に含めるか除外できる必要があります。

たとえば、フィルタパターンは次のことができる必要があります。

  • /bar(およびすべてのサブキー)と一致しますが、/foo/barは一致しません。
  • /bar および /baz を除外せず、/foo (およびすべてのサブキー) のみを含めます。
  • 無制限のレベルで作業してください。たとえば、/fooから.jpgを除外するには、/foo/cat.jpgと/foo/bar/dog.jpgを除外する必要があります。

私はこれを試しましたが、上記duのすべてを行うことはできませんでした。

答え1

ツールが欲しいと思います。

  1. ファイルパスのパターンに基づいてファイルを選択
  2. サイズおよび/またはディスク使用量を検索して要約します。

もしそうなら質問があります。一部のファイルパスが同じファイルを参照している場合(一緒にハードリンクされている場合)はどうなりますか?同じファイルなので、サイズを一度だけ計算しますか?

ファイルを見つけるには、主なオプションは次のとおりです。

  • 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}) ))

関連情報