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番目の文字で始まり最後の文字で終わります。