人が読めるサイズで並べ替える方法

人が読めるサイズで並べ替える方法

デフォルトでは、ファイルを見つけてサイズでソートします。人間が読めるサイズにサイズをソートしないと、スクリプトは機能します。しかし、私は人が読めるサイズを望んでいます。人が読めるサイズをソートする方法は?

たとえば、

 ls -l | sort -k 5 -n | awk '{print $9 " " $5}'

これは期待どおりに機能し、私のファイルサイズは昇順のバイト順です。

1.txt 1
test.txt 3
bash.sh* 573
DocGeneration.txt 1131
andres_stuff.txt 1465
Branches.xlsx 15087
foo 23735
bar 60566
2016_stuff.pdf 996850

これで人間が読めるサイズが欲しいので、lsに-hパラメータを追加しましたが、一部のファイルの順序が正しくありません。

 ls -lh | sort -k 5 -n | awk '{print $9 " " $5}'
1.txt 1
DocGeneration.txt 1.2K
andres_stuff.txt 1.5K
test.txt 3
Branches.xlsx 15K
foo 24K
bar 60K
bash.sh* 573
2016_stuff.pdf 974K

答え1

努力するsort -h k2

-h, --human-numeric-sort 人間が読める数字を比較します (例: 2K 1G)

Gnuソート、BSDソートなどの一部です。

答え2

lsこの機能は内蔵されています。この-Sオプションを使用して逆順に並べ替えます。ls -lShr

       -r, --reverse
              reverse order while sorting

       -S     sort by file size, largest first

答え3

特定のシェルが言及されていないので、zshシェルですべての操作を実行する方法は次のとおりです。

ls -lhf **/*(.Lk-1024oL)

globパターンはpathnameと同様に**一致*します/。つまり、再帰検索と同じです。

このlsコマンドは、人間が読めるサイズを有効にし、-h長いリスト出力形式を有効にします-l。この-fオプションはソートを無効にするため、lsファイルは指定された順序でのみ一覧表示されます。

**/*(.Lk-1024oL)この順序は、小さなファイルが最初にリストされるようにファイル名のワイルドカードパターンでソートされます。この**/*ビットは、このディレクトリとその下のディレクトリにあるすべてのファイルとディレクトリと一致しますが、(...)globの動作を修正します(「glob修飾子」です)。

oL最後()はoファイルサイズ(「長さ」)に基づいて名前をソートします。L

プレフィックスを使用する.と、globは通常のファイル(ディレクトリなし)のみに一致します。

このLk-1024ビットは、サイズが1024KB未満のファイルを選択します(「1024KB未満の長さ」)。

zshこれがデフォルトの対話型シェルではない場合は、次のものを使用できます。

zsh -c 'ls -lf **/*(.Lk-1024oL)'

setopt GLOB_DOTS隠された名前は(または)を使用してzsh -o GLOB_DOTS -c ...一致させることもできます。 ...または単にDglob修飾子文字列に追加してください。


numfmt上記の内容を拡張して、パス名と人間が読むことができるサイズを含む2列出力を望み、GNU coreutilsの出力もあると仮定すると、

zmodload -F zsh/stat b:zstat

for pathname in **/*(.Lk-1024oL); do
    printf '%s\t%s\n' "$pathname" "$(zstat +size "$pathname" | numfmt --to=iec)"
done

またはより速く、

paste <( printf '%s\n' **/*(.Lk-1024oL) ) \
      <( zstat -N +size **/*(.Lk-1024oL) | numfmt --to=iec )

答え4

これはうまくいくでしょうか?

ls -l | awk '{if ($5<=1024) {print}}' | sort -k 5 -n | awk '{print $9"\t"substr($5/1024,1,3)"k"} '| column -t

最初のawkexpは1M未満のファイルを探し、2番目のexpは結果からバイトサイズを取得し、それをKBに変換し、最初の3つの要素を印刷して人間が読めるサイズを提供します。

関連情報