数値順に並べられたファイルのリスト

数値順に並べられたファイルのリスト

log1からのファイルがたくさんありますlog164

UNIX 端末でディレクトリを並べ替えて一覧表示しようとしていますが、並べ替え機能は次の形式のみを提供します。

home:logs Home$ ls -1 | sort
log1.gz
log10.gz
log100.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz
...etc

私が望むもの

home:logs Home$ ls -1 | sort
log1.gz
log2.gz
log3.gz
log4.gz
log5.gz
log6.gz
log7.gz
...{more here}
log99.gz
log100.gz
log101.gz
log102.gz
...etc

これを行うために何を使用できるかについての提案はありますか?

答え1

lsこの特別な場合に組み込まれたGNU機能を使用するのはどうですか?

-v— テキスト内の(バージョン)番号の自然な順序

たとえば、

ls -1v log*

答え2

GNU lsの使用(つまり、Linux、Cygwin、またはGNU lsが特別にインストールされている他のシステムで):

ls -v

zshから:

echo *(n)

他のシェルでは:

echo log?.gz log??.gz log???.gz

各ファイル名を別々の行に表示するには、にecho変更します。printf '%s\n'

ファイルメタデータ()も必要ls -lで、GNU lsがない場合は、lsアルファベット順に表示したいファイル名またはファイル名グループごとに別々に呼び出す必要があります。

ls -ld log?.gz; ls -ld log??.gz; ls -ld log???.gz

この問題を回避するには、ファイル名の前にゼロを十分に使用して、事前ソートがよりユーザーフレンドリーになるようにします(log001.gz例:)。

答え3

bash中かっこは{}順番にリストされます。

for file in log{1..164}.gz; do
    process "$file"
done

答え4

この特別なケースでは、ls -1v間違いなく解決策は最高ですがsort、入力が出ていないときも動作するため、元の質問と同様に動作する解決策も持つ方が良いと思いますls。この場合、以下を使用できます。

ls -1 | sort -n -k1.4

この-nオプションは数値でソートし、ソートキー-k 1.4を最初のフィールド(この場合はフルファイル名)に設定するように指示し、4番目の文字で始まり最後の文字で終わります。

関連情報