番号順にディレクトリファイルを並べ替える

番号順にディレクトリファイルを並べ替える

このディレクトリがあります

$ ls
0    2    4    config.yml
1    3    catalog.svg

サブディレクトリには0から番号が付けられます。最大数量を確保する必要があります。

これを試してみるとls | sort -n私は得ます。

0
catalogIcon-gitlab.svg
config.yml
1
2
3
4

ここで何が起こっているのでしょうか? cはなぜ0と1の間ですか?

最上位の数値を取得するには、どのようにコマンドを作成する必要がありますか?

システム:Bash、MacOS

答え1

最も高い番号のディレクトリを取得するには、次のようにします。

max=$(printf "%s\n" */ | sort -n | tail -1)
echo "${max%/}"

答え2

sort -n「文字列値の基準」で並べ替えます。この場合、数値と文字の数値比較を試みるとき(ASCII 48)の後に(ASCII 99)を追加してそのバイトsortに置き換えます。 GNUソートオプションを使用すると、エラーが発生していることがわかります。memcmpc0--debug

$ ls |sort -n --debug
sort: using ‘en_US.UTF-8’ sorting rules
0
_
_
catalogIcon-gitlab.svg
^ no match for key
______________________
zoo
^ no match for key
___
1
# ... continues ...

Bash専用のソリューションでは、ループを使用します(指示どおりにディレクトリが最初から始まるとします0)。

highest=-1
for d in *; do [[ -d "$d" ]] || continue; [[ "$d" -gt "$highest" ]] && highest=$d; done
printf '%s\n' "$highest"

答え3

lsデフォルトでは、すでにアルファベット順にソートされています。このように短い形式で配列すると、誤った順序で読み取ることになります。各列を読み、次の列を読んでください。使用されている実際の語彙の順序を表示するには、ls1行に1つのオブジェクトを出力するようにしてください。

$ ls -1
0
1
2
3
4
catalog.svg
config.yml

答え4

どうですか? :

ls -1v
0
1
2
3
4
12
23
catalog.svg
config.yml

v はversionソート順を示します。

最後の(最も大きい)数字を取得するには、数字のみを選択してください。

$ ls -1v | grep -x '[0-9]*'
0
1
2
3
4
12
23

以下を使用して追跡します。

$ ls -1v | grep -x '[0-9]*' | tail -n 1
23

唯一のbashソリューション:

$ max=0; for d in */; do d=${d%/}; [[ d -gt max ]] && max=$d; done; printf '%d\n' "$max"
23

関連情報