「ls」のソート順を管理する改行の前に文字ソートはありますか?

「ls」のソート順を管理する改行の前に文字ソートはありますか?

私はいくつかのファイル命名ガイドラインを作成しており、最終改訂前にドラフト文書を一覧表示する方法を見つけようとしています。

例:現在私の命名規則は次のとおりです。

contract_foo_v1
contract_foo_v1~draft1
contract_foo_v1~draft2
contract_foo_v2
contract_foo_v2~draft1

問題は、v1〜draftをリストする必要があることです。今後v1(最終改訂)。次のように使用できる文字がありますか?

contract_foo_v1?draft1
contract_foo_v1?draft2
contract_foo_v1
contract_foo_v2?draft1
contract_foo_v2

また、ロケールとプログラムに違いがある可能性があることを理解しているので、ほとんどの場合(またはできるだけ多くの場合)に必要に応じて動作するキャラクターに対するアドバイスを求めています。助けてくれてありがとう。

ベストアンサー1

lsあなたの場合は、改行文字を含まないファイル名に基づいてファイルのリストを並べ替えます。も並べsort替えコンテンツ改行文字が含まれていない行なので、ソート可能な文字を見つけることはありません。改行前しかし、ソートされたもの何もない前にそして、あなたはそれを見つけることができません。

GNU ls -v(バージョンソート用)は、目的の順序でファイルのリストをソートします。

$ ls -v1
contract_foo_v1~draft1
contract_foo_v1~draft2
contract_foo_v1
contract_foo_v2~draft1
contract_foo_v2
contract_foo_v10

それ以外の場合-vは、ls語彙のソートのためにv10最初にソートされますv2

GNUでは、出力に次のものを使用するsortこともできます(ファイル名に改行文字が含まれていないと仮定します)。sort -Vls

$ ls | sort -V
contract_foo_v1~draft1
contract_foo_v1~draft2
contract_foo_v1
contract_foo_v2~draft1
contract_foo_v2
contract_foo_v10

POSIXlyでは、次のことができます。

$ ls | sort -t'~' -k1.15,1n -k2,2.1r -k2n
contract_foo_v1~draft1
contract_foo_v1~draft2
contract_foo_v1
contract_foo_v2~draft1
contract_foo_v2
contract_foo_v10

ただし、これはバージョンの前の部分の長さが常に14文字であると仮定します。

zshシェルを使用すると、次のようにグローバルソート順序を定義できます。

drafts_first() {
  [[ $REPLY = *'~draft'* ]] || REPLY="$REPLY~release"
}
printf '%s\n' *(no+drafts_first)

文書ごとのバージョンが999以下で、バージョンごとのドラフトが99以下であると仮定してファイル名を指定することもできますcontract_foo_v001_draft01contract_foo_v001_releaseまたはcontract_foo_v001_final@Kusalanandaが提案したように、次の単語が何でも)選択することもできます。draft正しい順序でls語彙順にファイルを一覧表示します。

ls -rt修正時間(最後の最後)またはglob修飾子によるOmファイルの並べ替えも参照してくださいzsh

これで、これらのファイル名に拡張子(たとえば)を追加すると、.pdfまったく異なる話になります。

$ LC_ALL=en_US.UTF-8 ls -1
contract_foo_v10.pdf
contract_foo_v1~draft1.pdf
contract_foo_v1~draft2.pdf
contract_foo_v1.pdf
contract_foo_v2~draft1.pdf
contract_foo_v2.pdf
$ LC_ALL=C ls -1
contract_foo_v1.pdf
contract_foo_v10.pdf
contract_foo_v1~draft1.pdf
contract_foo_v1~draft2.pdf
contract_foo_v2.pdf
contract_foo_v2~draft1.pdf

私のen_US.UTF-8ロケールでは、~最初の比較と両方が無視されるので、ソートが前に来るので前に来、ソートが前に来るので前に来ます(これは拡張とは異なります)。.v10v1~d0dv1~draftv1.pdfdraftpdf.docx

Cロケールにはパスが1つだけあり、ソートはバイト値に基づいてその順序でソートさ.れます。 ASCIIで印刷可能な最高値の文字なので最悪の選択です。前に、、、、allのようにたくさんあります。0~~.#-%無視される上記の最初のステップでは、iso14651_t1は次のロケールで実行されます。

したがって、v2対v10の問題を解決するためにゼロパディングを使用し-、代わりに拡張を使用すると、希望の順序を取得できます~.pdf人類ロケールおよびC/C.UTF-8ロケールでは、順序はコードポイントに基づいています。

$ LC_ALL=en_US.UTF-8 ls -1
contract_foo_v01-draft1.pdf
contract_foo_v01-draft2.pdf
contract_foo_v01.pdf
contract_foo_v02-draft1.pdf
contract_foo_v02.pdf
contract_foo_v10.pdf
$ LC_ALL=C ls -1
contract_foo_v01-draft1.pdf
contract_foo_v01-draft2.pdf
contract_foo_v01.pdf
contract_foo_v02-draft1.pdf
contract_foo_v02.pdf
contract_foo_v10.pdf

おすすめ記事