数値順にファイルをリストする


123

私はからのファイルの束を持っているlog1log164

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

私がこれを行うために使用できるものの提案はありますか?


8
これは絶対にプログラミングの質問であり、答えが低レベルのシェルプログラミング言語に関係しているという理由だけで移行する価値はありません!!!
tchrist

あなたは彼らが命名していることが事前にわかっている場合log1.gzを通じてlog164.gz、そしてあなたもに何が必要なのでしょls -1ためにそれら?
-ruakh

1
@ruakh ls -1は、結果を1列に表示するのではなく、1列に表示します

3
@Rabiani:私は何をするのか知ってls -1います:ファイル名をリストします。あなたはすでにファイル名を知っていたので、私はあなたが何のためにそれを必要としていたのか理解できませんでした。しかし、あなたはケビンの答えを受け入れたので、私は今知ってます:あなたはそれを必要としなかった。より理にかなっています。:
ruakh

回答:


40

bashの中括弧、は{}、それらを順番に列挙します。

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

267

lsこの特定のケースに組み込み機能を使用しない理由、つまり

-v natural sort of (version) numbers within text

例えば ls -1v log*


素晴らしい解決策ですが、sortファイルのディレクトリではなく文字列の配列がある場合に、を使用して同様に簡単な解決策があればいいのですが
-Hubro

23
BSD / OSXでは、このオプションは別のものです-v - Force unedited printing of non-graphic characters
ケノーブ

残念ながら、-vオプションはAIX(6.1)
-bouvierr

6
これが最良の答えです。
-32r34wgf3e

1
MacOSの場合、これは機能しますが、前述のオプションが見つかりませんでしたls | sort -n
リッキーレヴィ

47

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など)になるように、ファイル名に十分な先行ゼロを使用します。


29

ls -1vこの特定のケースでは確かに解決策が最も優れていますがsort、元の質問のように機能するものもあると良いと思いますls。この場合、次を使用できます。

ls -1 | sort -n -k1.4

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


私の場合、ls -1 | sort -n -k1.4機能しません。ソートされていないものを最初に4文字まで、次に4文字目以降にソートされたものを与えます。ls -1 |sort | sort -n -k1.4代わりに使用しましたが、完全に機能しました。
プラブー14

3
代わりに、@ Prabhuができますsort -k1.1,1.3 -k1.4nsort実装は安定している必要はないため、すべての実装でアプローチが機能するわけではありません。-VGNUおよびFreeBSDのオプションも参照してくださいsort
ステファンシャゼル

21

GNU sort(Linuxで利用可能)には、「バージョンソート」モードがあります。このモードでは、非数値内の数値を、要求どおりに解釈します。

からman 1 sort

    -V, --version-sort
           natural sort of (version) numbers within text

(リストに空のテストファイルを作成:
touch log1.gz log2.gz log3.gz log99.gz log100.gz log101.gz log102.gz

-Vオプション(または--version-sort)を追加する例:

ls -1 log*.gz | sort -V
log1.gz
log2.gz
log3.gz
log99.gz
log100.gz
log101.gz
log102.gz


3

私のバージョンのSolarisはls -v(grrr)をサポートしていません。上記のソートソリューションでは、1)ファイル名の数字の位置に関する知識が必要であり、2)マルチパートバージョン番号のようなものを処理しません。

以下のアプローチはSolaris互換であり、数字の位置を事前に把握する必要はなく、2、3、または4コンポーネント(a-1.2、foo-5.6.7、bar_baz_9.10.11.12など)のバージョン番号を処理します。またsort -f、大文字と小文字を一緒に折りたたみ、ファイルと混在するディレクトリを適切に処理します。

ls -d | sort -f -t . -k 1,1 -k 2,2n -k 3,3n -k 4,4n

このバージョンでは、最初のコンポーネントが1桁に制限されることに注意してください。

ターゲットオペレーティングシステムがをサポートしているls -v場合、それが明らかに優れたソリューションです。



1
$ ls
log101.gz  log102.gz  log103.gz  log104.gz  log105.gz  log106.gz  log10.gz  log1.gz
$ ls | sort -t . -n -k1.4
log1.gz
log10.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz

1
ここで-t .は不要です。
ステファンシャゼル

0

これは私のために働いた。

ファイルがあります1.jpg 2.jpg ... 18.jpg

$ echo *.jpg | tr -s ' ' '\n' | sort -n

sortls印刷できないカラー文字のため、出力と混同されています。これを試してみると:

ls -1 --color=none *.jpg | sort -n

完全に機能します。

sort-iオプションで印刷できない文字を無視することはできますが、それでも動作せず、理由はわかりません。

しかし、あなたはいつでもこのように色を取り除くことができ、sort動作します:

ls -1 --color=always *.jpg | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sort -n

いつかsortこのオプションが用意されることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.