
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
ファイル名の空白も処理するために、印刷と予想される区切り文字は、通常の空白ではなくxargs
null 記号に設定されます。
find -maxdepth 2 -type f -print0 | xargs -0 du -ch | tail -n1
最大引数数を超える多くのファイルが見つかると予想される場合、xargs はそのファイルを複数の呼び出しにdu
分割します。その後、tail
aで置き換えることで解決でき、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