バージョン別にファイル名を並べ替える

バージョン別にファイル名を並べ替える

以下のようにディレクトリのファイル名をソートしようとしています。

$ ls -1v
file-1.10.0-114.1.1.x86.tb1_2.rpm  
file-1.10.0-114.2.2.x86.tb1_2.rpm  
file-1.10.0-114.11.2.x86.tb1_2.rpm  
file-1.10.0-114.x86.tb1_2.rpm  
file-1.10.0-115.1.1.x86.tb1_2.rpm  
file-1.10.0-115.2.2.x86.tb1_2.rpm  
file-1.10.0-115.3.1.x86.tb1_2.rpm  
file-1.10.0-115.22.1.x86.tb1_2.rpm  
file-1.10.0-115.x86.tb1_2.rpm  

しかし、私の期待は次のとおりです。

file-1.10.0-114.x86.tb1_2.rpm  
file-1.10.0-114.1.1.x86.tb1_2.rpm  
file-1.10.0-114.2.2.x86.tb1_2.rpm  
file-1.10.0-114.11.2.x86.tb1_2.rpm  
file-1.10.0-115.x86.tb1_2.rpm  
file-1.10.0-115.1.1.x86.tb1_2.rpm  
file-1.10.0-115.2.2.x86.tb1_2.rpm  
file-1.10.0-115.3.1.x86.tb1_2.rpm  
file-1.10.0-115.22.1.x86.tb1_2.rpm

試してみましたが、sort -V同じ結果が表示されます。どのようにソートする必要がありますか?

答え1

次のコマンドを試してください。

ls -h | sort -t. -k3,3 -k4,4n

ls -h- lsコマンドの標準出力(ユーザーとグループ名にドットが含まれていない場合は、ls -lhを使用して同じ結果を得ることができます)

-t.- コマンドをソートするための区切り文字を設定します。

-k3,3- 3番目のフィールドでソート

今後...

-k4,4n- 4番目のフィールドに基づいて数値順にソート

答え2

を使用すると、zsh次のことができます。

print -rl file*.rpm(noe:'REPLY=${REPLY%.x*}':)

つまり、n後半が削除されたファイル名は.x*数字でソートされます()。

GNUを使用して同様の操作を実行できますsort

ls | sort -Vtx -k 1,1

他の場所がないと仮定するとx、改行文字を含むファイル名に問題が発生することがあります。

またはこれを行うこともできます:

print -rl file*.rpm(noe:'REPLY=${REPLY//(#m)<->/Z$MATCH}':)

(with)各番号の前にsoをextendedglob付けてソートします。ZZ115.xZ86...Z115.Z1...

関連情報