web-dev-qa-db-ja.com

Bashで各ファイルとディレクトリのサイズを(再帰的に)リストし、サイズで降順に並べ替えるにはどうすればよいですか?

私はBashのディレクトリのサイズを取得するのは簡単ではないことがわかりましたか?

ls -<some options>と入力すると、ディレクトリのファイルサイズとファイルの合計をすべて同時にリストし、サイズ順に並べ替えることができます。

それは可能ですか?

103
Kit Ho

ディレクトリに移動し、次のコマンドを実行するだけです:

du -a --max-depth=1 | sort -n

または、人間が読めるサイズの場合は-hを追加し、大きなディレクトリ/ファイルを最初に印刷するには-rを追加します。

du -a -h --max-depth=1 | sort -hr
207
Developer
du -s -- * | sort -n

(これは隠しファイル(.dotfiles)を表示しません)

Mb単位などにdu -smを使用します。常に使用します

du -smc -- * | sort -n

明らかな理由により、合計行(-c)は最後に表示されるためです:)

PS:

  • ドットファイルの処理に関するコメントを参照してください
  • 私は頻繁に使用します'du -smc/home// | sort -n | tail 'を使用して、大きなビットが正確にどこにあるのかを把握します。
18
sehe

明らかに--max-depthオプションはMac OS Xのduコマンドのバージョンにはありません。代わりに次を使用できます。

du -h -d 1 | sort -n

15
cevaris

コマンド

du -h --max-depth=0 * | sort -hr

出力

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

説明

  • duは「ディスク使用量」を表示します
  • hは、「人間が読める」形式です(並べ替えとデュの両方)
  • max-depth=0duがサブフォルダーのサイズを表示しないことを意味します(すべてのファイルのすべてのサイズをすべてのサブ、サブサブ、...、フォルダーに表示する場合は削除してください)
  • rは「リバース」用です(最初に最大のファイル)

nCDU

この質問に来たとき、ファイルシステムをクリーンアップしたかったのです。コマンドラインツールncduは、このタスクにより適しています。

Ubuntuへのインストール:

$ Sudo apt-get install ncdu

使用法:

コマンドラインにncdu [path]と入力するだけです。パスを分析するために数秒後に、次のようなものが表示されます。

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

現在ハイライトされている要素を削除します dで終了 CTRL + c

12
Martin Thoma

ls -Sはサイズでソートします。次に、サイズも表示するために、ls -lSは長さ(-l)をサイズ(-S)でソートして表示します。読みやすくするために、通常-hも追加するので、ls -lhSを追加します。

4
Thanatos

シンプルで高速:

find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n

* GNU Parallel が必要です。

1
pje

私はあなたが何をしたいのか考えたかもしれないと思う。これにより、ファイルサイズとディレクトリ内のコンテンツのサイズでソートされた、すべてのファイルとすべてのディレクトリのソート済みリストが表示されます。

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n
0
dvorak

私はduを単純な方法で使用する傾向があります。

du -sh */ | sort -n

これにより、どのディレクトリが最もスペースを消費しているかがわかります。その後、より正確な検索を後で実行できます。

0
Pace

[拡張バージョン]
これは、以下の初期バージョンよりもはるかに高速で正確になり、現在のディレクトリのすべてのファイルサイズの合計を出力します:

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

ファイルのstat -c %sコマンドは、サイズをバイト単位で返します。ここのtrコマンドは、xargsコマンドの制限を克服するために使用されます(明らかにxargsへのパイプは、結果をより多くの行に分割し、コマンドのロジックを壊します)。したがって、trは、ラインフィードを+(プラス)記号に置き換えます。 sedには、通常のように数学を実行する最後のbc(基本計算機)コマンドからの苦情を避けるために、結果の文字列から最後の+記号を削除する唯一の目標があります。

パフォーマンス:いくつかのディレクトリと〜150.000ファイル以上(Fedora 15ボックスの現在のファイル数)でテストし、驚くべき結果が得られたと思います:

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

du -sb /コマンドと比較したい場合のために、推定ディスク使用量をバイト単位で出力します(-bオプション)

# du -sb /
12684646920 /

予想どおり、duユーティリティは実際の消費スペースではなく、各ファイルの割り当てられたスペースを返すため、コマンドの計算よりも少し大きくなります。

[初期バージョン]
フォルダーの正確な合計サイズを知る必要がある場合、duはファイルスペースの使用量を推定するため、duコマンドは使用できません。したがって、間違った結果、つまり近似値になります(合計サイズに近いかもしれませんが、実際のサイズよりも大きい可能性が高いです)。

私はあなたの質問に答えるさまざまな方法があるかもしれないと思いますが、これは私のものです:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

ですべてのファイルを検索します。ディレクトリ(お好きなディレクトリで変更します)、隠しファイルも含まれ、(xargsを使用して)名前を1行で出力し、ls -lを使用して詳細なリストを作成します。この(場合によっては)巨大な出力はcutコマンドにパイプされ、バイト単位のファイルサイズである5番目のフィールド(-f5)のみが取得され、再びxargsにパイプされてサイズの単一行が再び生成されますブランクで区切られます。ここで、各空白をプラス(+)記号で置き換えるsedマジックを実行し、最後にbc(基本的な計算機)が計算を行います。

追加の調整が必要な場合があり、引数リストについて長すぎるlsコマンドを不平を言う場合があります。

0
ztank1013

別のシンプルなソリューション。

$ for entry in $(ls); do du -s "$entry"; done | sort -n

結果は次のようになります

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

「du -s」を「du -sh」に変更すると、人間が読めるサイズが表示されますが、この方法で並べ替えることはできません。

0
Ambal

以下を使用して、サイズでファイルを一覧表示できますdu -h | sort -hr | moreまたはdu -h --max-depth = 0 * | sort -hr |もっと

0