
私はいくつかのファイル命名ガイドラインを作成しており、最終改訂前にドラフト文書を一覧表示する方法を見つけようとしています。
例:現在私の命名規則は次のとおりです。
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 -V
ls
$ 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_draft01
(contract_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
ロケールでは、~
最初の比較と両方が無視されるので、ソートが前に来るので前に来、ソートが前に来るので前に来ます(これは拡張とは異なります)。.
v10
v1~d
0
d
v1~draft
v1.pdf
draft
pdf
.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