バージョンソートに使用されるファイル名のプレフィックス、バージョン番号、およびサフィックスの定義は何ですか?

バージョンソートに使用されるファイル名のプレフィックス、バージョン番号、およびサフィックスの定義は何ですか?

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
  1. ファイル名が与えられると、プレフィックス、バージョン番号、サフィックスの定義は何ですか?
  2. サフィックスの場合、正規表現 ‘(\.[A-Za-z~][A-Za-z0-9~]*)*’

    • どういう意味ですか~
    • 正規表現の一部ですか?

    正規表現の構文はどこかに紹介されていますか?

  3. これらの3つの例では、ファイル名のプレフィックス、バージョン番号、およびサフィックスは何ですか?

  4. 最後の例では、最後の警告でファイル名がバージョン別にソートされるようにソートされるのはなぜですか?

ありがとうございます。

答え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代替項目でアルファベット順にソートされていない理由は明確ではありません。

関連情報