lsと人の数でソート

lsと人の数でソート

私はディレクトリを作成します mkdir site_{1..44}。並べ替えたい

site_1
site_2
site_3
site_4
...
site_44

私はコマンドを実行して ls | sort -hいます

site_1
site_10
site_11
site_12
site_13
site_14
site_15
site_16
site_17
site_18
site_19
site_2
site_20
site_21
site_22
site_23
site_24
site_25
site_26
site_27
site_28
site_29
site_3
site_30
site_31
site_32
site_33
site_34
site_35
site_36
site_37
site_38
site_39
site_4
site_40
site_41
site_42
site_43
site_44
site_5
site_6
site_7
site_8
site_9

私はどこで間違っていますか?

ベストアンサー1

GNUの使用ls:

ls -1 -v
ls --format=single-column --sort=version

GNUの使用sort(そしてファイル名に改行文字が含まれていないと仮定):

ls | sort -V
ls | sort --version-sort

を使用すると、zshglob修飾子を使用して数字でglobをソートすることもできますn

print -rC1 -- *(Nn)

(ここでullglob修飾子が使用されるため、N一致するファイルがない場合(*パターンで隠されていないファイルがない場合)、エラーを発生させる代わりに何も印刷しません。)

に渡された場合は、セルフソートを無効にするように指示するls必要があります(/ GNUを使用)。ls-U--sort=nonels

ls -ldU -- *(n)

N(引数が渡されない場合は何もリストされlsないため、ここでは使用されません.。)

Make it the default を使用することもできますset -o numericglobsort

しかし、より良いアプローチは、ファイル名にゼロパディングを使用して、数字と語彙を等しく整列させることです。

mkdir site_{01..44}    # zsh, bash, yash -o braceexpand
mkdir site_{1..44%02d} # ksh93

GNUsort -h自体がソートされています。人が読めるサイズAsdu -hまたはls -shexample が表示されている場所では123456789example が で表されるため、118Mここでは役に立ちません。

あなたの場合はsite_1…見えるものから始めないでください人が読めるサイズ、両方ともゼロとして扱われ、等しくソートされます。ただし、最後の比較では、行全体を語彙的に比較して、接続を切断する語彙ソートが行われます。

ディレクトリ名が指定されていて、後で見つけたサイズに基づいてソートしたい場合でも、site_314そのディレクトリsite_1.1Kがどこにあるかを教えてください。site_0.9M_sort人が読めるサイズsort -t_ -k1,1 -k2h最初の語彙の前の部分を最初にソートしてから、_次の部分をソートして_次のように解釈するのと同じです。人が読めるサイズhey仕様に準拠したロゴが含まれていますk

おすすめ記事