coreutils マニュアルでは、
10.1.4 バージョンソートの詳細、
バージョン順序は、ファイル名にしばしば以下が含まれることを処理します。 インデックスまたはバージョン番号。標準のソートは通常、比較が文字ごとに行われるため、予想される順序を生成しません。バージョンソートは、名前にインデックス/バージョン番号を含む多くのファイルを含むディレクトリを検索するときに特に便利です。
$ ls -1 $ ls -1v abc.zml-1.gz abc.zml-1.gz abc.zml-12.gz abc.zml-2.gz abc.zml-2.gz abc.zml-12.gz
バージョン別にソートされた文字列を比較して、次の
ver1
場合ver2
バージョン番号そしてプレフィックスそしてサフィックス(正規表現と一致するサフィックス‘(\.[A-Za-z~][A-Za-z0-9~]*)*’
)は文字列で、ver1
<はver2
名前がprefix ver1 suffix
前の順序で構成されていることを意味しますprefix ver2 suffix
。また、数値部分の先行ゼロは無視されます。
$ ls -1 $ ls -1v abc-1.007.tgz abc-1.01a.tgz abc-1.012b.tgz abc-1.007.tgz abc-1.01a.tgz abc-1.012b.tgz
この機能は、
filevercmp
注目すべきいくつかの注意事項があるgnulibの機能を使用して実装されています。•
LC_COLLATE
無視されます。つまり、数値以外の値がソートls -v
されます。sort -V
プレフィックスLC_COLLATE
ロケールカテゴリがに設定されているのと同じですC
。•一部サフィックス上記の正規表現と一致しません。したがって、次の例では、予想どおりに順序付けされない可能性があります。
abc-1.2.3.4.7z abc-1.2.3.7z abc-1.2.3.4.x86_64.rpm abc-1.2.3.x86_64.rpm
- ファイル名が与えられると、プレフィックス、バージョン番号、サフィックスの定義は何ですか?
サフィックスの場合、正規表現
‘(\.[A-Za-z~][A-Za-z0-9~]*)*’
で- どういう意味ですか
~
? ‘
正規表現の一部ですか?
正規表現の構文はどこかに紹介されていますか?
- どういう意味ですか
これらの3つの例では、ファイル名のプレフィックス、バージョン番号、およびサフィックスは何ですか?
最後の例では、最後の警告でファイル名がバージョン別にソートされるようにソートされるのはなぜですか?
ありがとうございます。
答え1
もちろん、これは説明するのが難しいです。
ソースコードを読んでこそ、究極の教化を実現できます。https://github.com/gagern/gnulib/blob/master/lib/filevercmp.c。オリジナル:
サフィックスは一致する最も長い文字列です(\.[A-Za-z~][A-Za-z0-9~]*)*$
。これを行うには、$
ファイル名の末尾に一致が必要です。サフィックスのドットで区切られた部分は、比較目的でバージョン番号と見なされます。
これは~
ファイル名に表示できる文字の1つだけです。これは時々バージョン番号に使用されます3.4.1~alpha
。
最後の例では、最後の警告でファイル名がバージョン別にソートされるようにソートされるのはなぜですか?
_
サフィックス文字は許可されていないため、で終わるファイルはバージョンのないファイル(またはバージョンのあるファイルのみ)x86_64.rpm
として扱われます。rpm
代替項目でアルファベット順にソートされていない理由は明確ではありません。