人間が読めるファイルサイズのソート


16

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

問題:ファイル/フォルダーを一覧表示し、サイズで並べ替える問題を検討します。以下を実行することでそれを達成できます:

du -s * | sort -n

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

人間が読める値に基づいてソートできるようにすることが望ましいので、

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

2.0M後に1.5GBのフォルダーが表示されます。

回答:



29

GNU coreutils> = 7.5を使用します。

du -hs * | ソート-h

(このserverfaultの質問から引用)

マニュアルページ

編集:あなたが使用してバージョンを確認することができますdu --versionし、sort --versionあなたがGNUのバージョンを使用している場合。homebrewを使用gduしている場合は、とを使用する必要がありgsortます。


8
OSXにはこのオプションはありません。homebrewを使用できますbrew install coreutils(すべてのcoreutilsコマンドの先頭に「g」を付けます)。その後、できますgdu -hs * | gsort -h
dsummersl 14

1
@dsummerslのポイントを明確にするため:du -hs *Mac OS Xでは正常に動作しsort -hますが、を返しますsort: invalid option -- hここで説明するように、MacPortsを使用してcoreutilsパッケージをインストールすることもできます
jvriesem 14年

3

どうやら1MBを超えるファイルが心配な場合は、このコマンドを使用してファイルをソートし、awkを使用してサイズをMBに変換できます。

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

繰り返しますが、これはサイズを最も近いMBに丸めます。選択したユニットに変換して変更できます。


これは次のようになりますdu -sm * | sort -n-s/ -g作るduメガバイト/ギガバイトで出力サイズを。
notnoop

MBの場合は、さらに1024で割る必要があります。だからint($1 / (1024 * 1024))
Pratik Khadloya 14

2

これは、空白またはアポストロフィを含むファイル名を処理し、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

1

もう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

du -sk * | sort -n | awk '{print $ 2}' | fを読みながら do du -sh "$ f"; やった


1

このコマンドはサイズをMBでソートします

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

それはすでにユーザーが実際に行っていることです。彼/彼女はMiBで例を挙げませんでしたが、それについて言及しました。彼/彼女が探しているのは-h、duにフラグを使用するときにソートできるようにすることです。
トニン

0

同じ出力でMBとGBを組み合わせた何かを並べ替えようとしていて、制御できなかったため、ここで終わりました。

$NF#GBor #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

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

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