人間が読めるファイルサイズの並べ替え、サイズ識別子(G、M、K)を考慮した数値の並べ替えを使用してリストを並べ替えるにはどうすればよいですか? 「du -sh
"出力など?
問題:ファイル/フォルダーを一覧表示し、サイズで並べ替える問題を検討してください。あなたは実行することによってそれを達成することができます:
du -s * | sort -n
これは、サイズでソートされたファイル/フォルダーをリストします。ただし、印刷されるサイズの値はバイト単位(またはメガバイト、または選択した場合はギガバイト)です。
人間が読める値に基づいてソートできることが望ましいので、次のようなものを実行できます。
du -sh * | <human-readable file sort>
そして、2.0Mの後に1.5GBのフォルダが表示されます。
Afaik、これを行うための標準的なコマンドはありません。
Stack Overflowで同じ質問があったときに議論されたさまざまな回避策があります: du -h出力をサイズで並べ替えるにはどうすればよいですか
GNU coreutils> = 7.5:
du -hs * |並べ替え-h
(これから取得 serverfault質問 )
編集:GNUバージョンを使用している場合は、du --version
およびsort --version
を使用してバージョンを確認できます。自作を使用している場合は、gdu
およびgsort
。
1MBを超えるファイルが心配な場合は、次のコマンドを使用してファイルを並べ替え、awkを使用してサイズをMBに変換できます。
du -s * | sort -n | awk '{print int($1 / 1024)"M\t"$2}'
繰り返しますが、これはサイズを最も近いMBに丸めます。お好みの単位に変換して変更できます。
これは空白またはアポストロフィを含むファイル名を処理し、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つです:
$ 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
最初。
このコマンドはサイズでMB単位で並べ替えます
du --block-size=MiB --max-depth=1 path | sort -n
du -sk * |並べ替え-n | awk '{print $ 2}' | fを読みながら; do du -sh "$ f";完了
同じ出力で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回だけ実行し、その場で置き換えますが、その方法はまだわかりません:)