web-dev-qa-db-ja.com

人間が読めるファイルサイズの並べ替え

人間が読めるファイルサイズの並べ替え、サイズ識別子(G、M、K)を考慮した数値の並べ替えを使用してリストを並べ替えるにはどうすればよいですか? 「du -sh "出力など?

問題:ファイル/フォルダーを一覧表示し、サイズで並べ替える問題を検討してください。あなたは実行することによってそれを達成することができます:

du -s * | sort -n

これは、サイズでソートされたファイル/フォルダーをリストします。ただし、印刷されるサイズの値はバイト単位(またはメガバイト、または選択した場合はギガバイト)です。

人間が読める値に基づいてソートできることが望ましいので、次のようなものを実行できます。

du -sh * | <human-readable file sort>

そして、2.0Mの後に1.5GBのフォルダが表示されます。

16
notnoop

Afaik、これを行うための標準的なコマンドはありません。

Stack Overflowで同じ質問があったときに議論されたさまざまな回避策があります: du -h出力をサイズで並べ替えるにはどうすればよいですか

4
user4358

GNU coreutils> = 7.5:

du -hs * |並べ替え-h

(これから取得 serverfault質問

マニュアルページ

編集:GNUバージョンを使用している場合は、du --versionおよびsort --versionを使用してバージョンを確認できます。自作を使用している場合は、gduおよびgsort

29
Jason Axelson

1MBを超えるファイルが心配な場合は、次のコマンドを使用してファイルを並べ替え、awkを使用してサイズをMBに変換できます。

du -s * | sort -n | awk '{print int($1 / 1024)"M\t"$2}'

繰り返しますが、これはサイズを最も近いMBに丸めます。お好みの単位に変換して変更できます。

3
Patrick

これは空白またはアポストロフィを含むファイル名を処理し、xargs -dまたはsort -hをサポートしないシステムで機能します。

du -s * | sort -n | cut -f2 | tr '\n' '\0' | xargs -0 -I {} du -sh "{}"

その結果:

368K    diskmanagementd
392K    racoon
468K    coreaudiod
472K    securityd
660K    sshd
3.6M    php-fpm
2
Mark Crossfield

これがもう1つです:

$ du -B1 | sort -nr | Perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane 'print format_bytes($F[0])."\t".$F[1]'

あなたはする必要があるかもしれません

$ cpan Number::Bytes::Human

最初。

1
0x89

このコマンドはサイズでMB単位で並べ替えます

du --block-size=MiB --max-depth=1 path | sort -n
1
lukmansh

du -sk * |並べ替え-n | awk '{print $ 2}' | fを読みながら; do du -sh "$ f";完了

1
CLF

同じ出力でMBとGBを組み合わせた他の何かをソートしようとしていて、それを制御できなかったため、ここに行き着きました。

_$NF_または_#GB_パターンが出力の最後の列であったため、_#MB_が使用されます。

_somecommand | \
gawk '{
  if ($NF ~ /[0-9\.]+GB/) 
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF} 
}' | \
sort -n
_

Awkコマンドの説明:

if ($NF ~ /[0-9\.]+GB/)

最後の列が、数字または_._を1回以上含み、その後にGBが続く正規表現パターンと一致する場合

{ a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \

次に、変数aを、同じ最後の列の同じ正規表現パターンに一致する各行の数字部分に設定します(_$NF_)

_printf "%sMB\n", a*1024} \_

aを設定した後、printfを使用して出力を_${a*1024}MB_としてフォーマットします

_else {print $NF}_

それ以外の場合は、最後の列を印刷するだけです

_sort -n_

出力で数値ソートを使用する


_echo "4MB\n5GB\n420MB\n420GB\n1024MB\n1GB" | \                                                                                                                                 23:43:06 (EMP-2653/package-upgrades) Ø M
gawk '{
  if ($NF ~ /[0-9\.]+GB/)
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF}
}' | \
sort -n
_

正規表現パターンを再利用する方法があると確信しているので、マッチを1回だけ実行し、その場で置き換えますが、その方法はまだわかりません:)

0
Jens Bodal