このディレクトリがあります
$ 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ソートオプションを使用すると、エラーが発生していることがわかります。memcmp
c
0
--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
デフォルトでは、すでにアルファベット順にソートされています。このように短い形式で配列すると、誤った順序で読み取ることになります。各列を読み、次の列を読んでください。使用されている実際の語彙の順序を表示するには、ls
1行に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