
以下のようにディレクトリのファイル名をソートしようとしています。
$ 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
付けてソートします。Z
Z115.xZ86...
Z115.Z1...