デフォルトでは、ファイルを見つけてサイズでソートします。人間が読めるサイズにサイズをソートしないと、スクリプトは機能します。しかし、私は人が読めるサイズを望んでいます。人が読めるサイズをソートする方法は?
たとえば、
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 ...
一致させることもできます。 ...または単にD
glob修飾子文字列に追加してください。
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
最初のawk
expは1M未満のファイルを探し、2番目のexpは結果からバイトサイズを取得し、それをKBに変換し、最初の3つの要素を印刷して人間が読めるサイズを提供します。