find ::を持つlsは、全体のサイズを報告します。

find ::を持つlsは、全体のサイズを報告します。

aを満たすファイルの合計サイズを取得しようとしていますfind。たとえば、次のようになります。

ls  $(find -maxdepth 2 -type f)

ただし、この呼び出しはls全体のサイズも生成しません。

答え1

信じるかどうか、findおよびを使用してこれを達成することができますdu。私は以前ブログに投稿した同様の技術を使用しました。その記事のタイトルは次のとおりです。[1行]:duを使用して、Linux上のファイルリストのディスク容量を計算します。

投稿のポイントは次のコマンドです。

$ find -maxdepth 2 -type f | tr '\n' '\0' | du -ch --files0-from=-

はい

要約全体とともに、すべてのファイルのサイズが一覧表示されます。

$ find -maxdepth 2 -type f | tr '\n' '\0' | du -ch --files0-from=- | tail -10
0   ./92086/2.txt
0   ./92086/5.txt
0   ./92086/14.txt
0   ./92086/19.txt
0   ./92086/18.txt
0   ./92086/17.txt
4.0K    ./load.bash
4.0K    ./100855/plain.txt
4.0K    ./100855/tst_ccmds.bash
21M total

メモ:私が知る限り、このソリューションにはGNUスイッチduのサポートが必要です。--files0-from=

du マニュアルページから抜粋

--files0-from=F
          summarize disk usage of the NUL-terminated file names specified in 
          file F; If F is - then read names from standard input

また、このメソッドは、スペース、印刷できない文字など、ファイル名の特殊文字を処理できません。

はい

du: cannot access `./101415/fileD': No such file or directory
du: cannot access `E': No such file or directory

tr .. ..これらの問題は、代替文字に置き換えるより多くのコマンドを導入することで解決できます。しかし、GNUのfind

改善する

あなたのバージョンがこのfindスイッチ--print0を提供している場合は、この注文を使用して印刷できないスペースや特殊文字を含むファイルを処理できます。

$ find -maxdepth 2 -type f -print0 | du -ch --files0-from=- | tail -10
0   ./92086/2.txt
0   ./92086/5.txt
0   ./92086/14.txt
0   ./92086/19.txt
0   ./92086/18.txt
0   ./92086/17.txt
4.0K    ./load.bash
4.0K    ./100855/plain.txt
4.0K    ./100855/tst_ccmds.bash
21M total

答え2

du(ディスク使用量)ファイルが占めるスペースを計算します。見つかったファイルを渡し、要約(-c)し、-hバイト数の代わりに人に読める形式()で印刷するように指示します。これにより、すべてのファイルのサイズと全体のサイズを取得できます。最後の行だけに興味がある場合は、これを行うことがtailできます。

findファイル名の空白も処理するために、印刷と予想される区切り文字は、通常の空白ではなくxargsnull 記号に設定されます。

find -maxdepth 2 -type f -print0 | xargs -0 du -ch | tail -n1

最大引数数を超える多くのファイルが見つかると予想される場合、xargs はそのファイルを複数の呼び出しにdu分割します。その後、tailaで置き換えることで解決でき、grep要約行のみが表示されます。

find -maxdepth 2 -type f -print0 | xargs -0 du -ch | grep -P '\ttotal$'

答え3

別のアプローチ:ファイル名ではなくファイルサイズのみが必要なので、「CRを含む名前、スペースを含む名前など」などの「奇妙な」ファイル名を削除できます。

 find /some/path -maxdepth 2 -type f -ls -exec printf '\000' \; \
     | tr -cd ' -~\000' \
     | tr '\000' '\n'   \
     | awk  '{ sum+=$7 } END { print "total size: ",sum }'

秘訣は次のとおりです。

1)各ファイルの「-ls」出力と「\ 000」文字を印刷します(次の行にありますが、問題はありません。手順2を参照)
すべてが「ASCII印刷不可能」です。( '\t'と '\n'を含む。しかし、我々はまた\000「一般」印刷可能なASCIIに加えて、各ファイルの行が終わる場所を知る必要があるため、ASCIIが必要です! )。これにより、ファイル名にもはや珍しいことはなくなります(「\n」なし、「¥t」なし、「;」なしなど)。また、ファイルサイズ "-ls"の7番目のフィールドを見つけるためにこれらのスペースが必要なため、スペースを保持します。
3) 追加された '\000' を '\n' に変換します (ステップ 2)。また削除します。一部のファイル名にも含まれている場合はそれを含めてください。 )
4) 次に、7番目の列を追加して最終サイズをバイト単位で取得します。

これは移植性に非常に優れています(「-print0」などは必要ありません)。

答え4

find -maxdepth 2 -type f --print0 | xargs -0 du -ch

関連情報