du -hが期待どおりに機能しないのはなぜですか?

du -hが期待どおりに機能しないのはなぜですか?

人間が読めるフラグを使用してduコマンドの出力を並べ替え、拡張子(G、M、Kなど)を無視し、数値だけで結果を並べ替えると同時に-hを削除すると、期待どおりに結果にフラグが付けられます。を指定しようとしています。

:~/du_exmp$ du -h ./* | sort -n
1.0M    ./file2.txt
2.0G    ./file3.txt
 52K    ./file1.txt
:~/du_exmp$ du  ./* | sort -n
104 ./file1.txt
2048    ./file2.txt
4204192 ./file3.txt

問題の源は何ですか?どうやって解決しますか?

答え1

努力するsort -h。マニュアルから-h, --human-numeric-sort compare human readable numbers (e.g., 2K 1G)

sort --helpコマンドオプションをよりよく理解するために使用します。

答え2

問題は、あなたが見るものがどのようにsort -n機能するかです。行の最初の先行値(またはより一般的に-kフィールドを使用している場合)を表示して並べ替えます。サフィックスを全く理解していないので、KMGサフィックスに出会うと数字検索を中止します。

最も簡単な方法は、2番目の例で行ったことです。フラグなしduで使用すると、完全に自然に動作します。-hsort

人がより読みやすい出力を維持するには、du -h別の中間パイプラインステップを使用してデコードされた数値をの出力に追加してソートし、オプションでソートキーを削除してdu出力を次のように表示する必要があります。ぴったりですからそうでしたdu

別のオプションは、プレーンを使用し、du2番目の例のように出力をソートし、出力を別のステップにパイプして純粋な整数をエンコードすることですdu -h

awk伝統的には、最後の2つのアイデアを使用しますが、やはりperl動作pythonします。

関連情報