概要
小ネタ。よく忘れるのでメモメモ。
連番が付与されているファイルが10個以上になると、普通に
ls -1 | sort
ってやっても、ちゃんとソートされません。
デフォルトでは後ろの番号部分も文字列として認識してソートしてしまうからですね。
これを「数値」として sort コマンドさんに認識してもらってソートするには以下のようにします。
ls -1 | sort -n -t . -k 2
-n
が 数値ソート してと指示するオプション。 long-name だと --numeric-sort
です。
-t
が 区切り文字 を指定するオプション。 long-name だと --field-separator
です。
-k
が 何カラム目 を利用するかを指定するオプション。long-name だと --key
です。
-k
オプションは、昔は +1
とか +2
とかの指定でした。今でも使えると思います。
サンプル
#!/usr/bin/env bash # # sort コマンドでファイルの数値部分でソートする # # REFERENCES: # - https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html # - https://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html#dd-invocation # basedirpath=/tmp/try-linux/sort/numeric_sort rm -rf "${basedirpath}" mkdir -p "${basedirpath}" ## テスト用のファイルを生成 # for ((i=0; i<15; i++)) do dd \ if=/dev/zero \ of="${basedirpath}/zero.bin.${i}" \ bs=1024 \ count=1 \ 2>/dev/null done ## そのまま ls # # 数値部分を文字列で解釈するので数値順に並ばない ls -1 "${basedirpath}" echo '--------------------------------------------' ## オプション付けずに sort # # これも sort コマンドからすると何で並び替えるのかを指定していないので # 結果は上の ls の場合と同じになる ls -1 "${basedirpath}" | sort echo '--------------------------------------------' ## オプションを付けて sort # # 以下のオプションを付与 # - -n : --numeric-sort (数値でソート) # - -t : --field-separator (指定した文字をセパレータとして利用) # - -k : --key (ソート対象とするカラム位置) ls -1 "${basedirpath}" | sort -n -t . -k 3
try-linux/numeric_sort.sh at master · devlights/try-linux · GitHub
実行すると以下のようになります。
gitpod /workspace/try-linux $ make ENTER EXAMPLE NAME: numeric_sort [INPUT ] numeric_sort [TARGET] sort_numeric_sort [SCRIPT] basic/sort/numeric_sort.sh ===== START [basic/sort/numeric_sort.sh] ===== zero.bin.0 zero.bin.1 zero.bin.10 zero.bin.11 zero.bin.12 zero.bin.13 zero.bin.14 zero.bin.2 zero.bin.3 zero.bin.4 zero.bin.5 zero.bin.6 zero.bin.7 zero.bin.8 zero.bin.9 -------------------------------------------- zero.bin.0 zero.bin.1 zero.bin.10 zero.bin.11 zero.bin.12 zero.bin.13 zero.bin.14 zero.bin.2 zero.bin.3 zero.bin.4 zero.bin.5 zero.bin.6 zero.bin.7 zero.bin.8 zero.bin.9 -------------------------------------------- zero.bin.0 zero.bin.1 zero.bin.2 zero.bin.3 zero.bin.4 zero.bin.5 zero.bin.6 zero.bin.7 zero.bin.8 zero.bin.9 zero.bin.10 zero.bin.11 zero.bin.12 zero.bin.13 zero.bin.14 ===== END [basic/sort/numeric_sort.sh] ===== DONE
参考情報
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場