ディレクトリリストにファイルサイズの合計を表示する


71

Windowsのdirディレクトリリストコマンドの最後には、リストされたファイルが占めるスペースの総量を示す行があります。たとえば、現在のディレクトリ内のdir *.exeすべての.exeファイル、サイズ、およびサイズの合計を表示します。dirbashのエイリアスで同様の機能を使用したいのですが、どうすればいいのかわかりません。

現在、私は持っているalias dir='ls -FaGl'私に.bash_profile示して、

drwxr-x---+  24 mattdmo  4096 Mar 14 16:35 ./
drwxr-x--x. 256 root    12288 Apr  8 21:29 ../
-rw-------    1 mattdmo 13795 Apr  4 17:52 .bash_history
-rw-r--r--    1 mattdmo    18 May 10  2012 .bash_logout
-rw-r--r--    1 mattdmo   395 Dec  9 17:33 .bash_profile
-rw-r--r--    1 mattdmo   176 May 10  2012 .bash_profile~
-rw-r--r--    1 mattdmo   411 Dec  9 17:33 .bashrc
-rw-r--r--    1 mattdmo   124 May 10  2012 .bashrc~
drwx------    2 mattdmo  4096 Mar 24 20:03 bin/
drwxrwxr-x    2 mattdmo  4096 Mar 11 16:29 download/

例えば。この質問から答えを取ります:

dir | awk '{ total += $4 }; END { print total }'

合計はわかりますが、ディレクトリリスト自体は出力されません。これをワンライナーまたはシェルスクリプトに変更して、必要なls引数を渡しdir、完全なリストと合計を取得する方法はありますか?たとえばdir -R *.jpg *.tif、すべてのサブディレクトリでこれらのファイルタイプのリストと合計サイズを取得するために実行したいと思います。理想的には、各サブディレクトリのサイズを取得できれば素晴らしいと思いますが、これは必須ではありません。


5
どうしてls -lh助けにならないの?合計を上に印刷します。また、実行du -sh *.exeして、人間が読める形式でディスク領域の使用情報を取得することもできます。
バガヴァダー

@ashwin「合計」ls -lhが何を印刷しているのかわかりませんが、awk以下のスクリプトが計算するものや、手作業で合計するものとは必ずしも関連していません。ディレクトリ内のファイルのKB数に近い場合もありますが、割り当てられたサブディレクトリのサイズが有効にならないようです。正確にその数が何であるかの説明に向けて私を指すことができれば私は感謝します
...-MattDMo

以下の私の答えがあなたのために働くかどうかを確認してください
バガヴァダー

1
ls -lhそれの内容を計算するディレクトリのサイズの合計が表示されない
aequalsb

回答:


25

次の関数は、あなたが求めていることのほとんどを行います:

dir () { ls -FaGl "${@}" | awk '{ total += $4; print }; END { print total }'; }

...しかし、それはあなたが何を求めているのかを教えてくれdir -R *.jpg *.tifませんls -R。あなたはfindそのためのユーティリティで遊んでみたいかもしれません。


1
これは、ディスクでファイルが消費するサイズではなく、本質的に各ファイルのコンテンツサイズを探している場合に当てはまります。この区別は、非常に小さなファイルに対してより顕著です。私のディストリビューションでは、各ファイルに4 KBのチャンクでディスク上のスペースが割り当てられています(したがって、duコマンドで報告されるように、300バイトのファイルはディスク上で4Kを使用します)。OPが「各ファイルが占めるスペース」を探していたことを考えると、duがその方法です。
ジョンV

1
dirはすでに人気のあるGNU coreutilの名前です。そのような関数には名前を付けたくありません。
デザート

LinuxとOS-Sの両方で動作し、「-a」に「。」が含まれるように修正してください。よくない「..」:)固定コマンドは次のとおりです。dir(){ls -FAl "$ {@}" | awk '{合計+ = $ 5; 印刷}; END {print "total:" total} '; }
Dmitry Shevkoplyas

148

これにはすでにUNIXコマンドがあります。 du

ただやる:

du -ach 

規則に従って、コマンドの最後に1つ以上のファイルまたはディレクトリパスを追加できます。-hは、サイズを人間に優しい形式に変換するための拡張機能であり-a、「見かけの」サイズ(ディスク使用量ではなくファイルサイズ)を-c提供し、最後に合計を提供します。


12
はい、デュは正常に動作します。-cオプション(--totalと同じ)を使用して、リストの最後に合計を取得できます。
MikeB

6
duファイルサイズの合計ではなく、ディスクの使用量を示していることに注意してください。
ステファンシャゼル

7
du -h渡されるファイルのサイズを合計しません。du -h *.so各ファイルのサイズを表示しますが、合計は表示しません。ここであなたが望んでいるのはdu -hc *.so(あるいはdu -hc *.so | tail -1)であると思います。しかしもちろん、彼はディレクトリのリストも必要としています。
限定A罪

1
このコマンドは、ファイルの短いリストでのみ機能します。ディレクトリに850000個のファイルがあるとどうなるかを確認してください!!!
ハミドFzM

3
-aを意味し--allます。むしろ、使用することを検討してください--apparent-size
アルノーVM



6

perlの場合:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

現在のディレクトリにあるすべての隠されていないPDFファイルのサイズ。


1

以下を.bash_profileまたは.bashrcに追加するとうまくいきます。

dir ()
{
find . -iname "$@" -exec ls -lh {} \;
find . -iname "$@" -print0|xargs -r0 du -csh|tail -n 1;
}

dir * .mp3を実行すると、再帰的に実行され、最後にtotalが出力されます。検索にmaxdepthパラメーターを追加することで、必要な深さを制御できます。findを2回実行することはあまり効率的ではありません。しかし、私はより良い方法を考えることができませんでした。少なくとも、仕事は完了です。


1

上記のようなduawkステートメントを使用すると、探しているものが提供されます。

例: du /home/abc/Downloads/*.jpg | awk '{ print; total += $1 }; END { print "total size: ",total }'

これは、.jpgで終わるユーザーabcのフォルダーDownloads内のすべてのファイルをリストし、リストの最後にこれらすべてのファイルの合計を印刷します。


0

他の提案されたオプションを使用せずに、dir出力とサイズ計算の両方を取得するには、tee(1)とプロセス置換を使用できます...

dir | tee >( awk '{ total += $4 }; END { print total }' )

使用する必要はありませんtee、ただdir | awk '{print; total += $4}; END {print total}'
ステファンChazelas

0
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'

3
いいえ。最初に、コマンドを与えるだけでは答えになりません。第二に、質問全体、他の回答、および私のコメントを読むことに煩わされた場合、これは私が望んでいるものではないことがわかるでしょう。
MattDMo

ポスターに公平を期すために、これはGoogle検索の最初の検索結果であり、linux sum human readable sizes私が探しているものです。
Sridhar Sarnobat

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.