バージョン番号のソート

item2item10のようなバージョン番号を含む文字列を正しい順序でソートするには、-V(--version-sort)オプションを使用する。

$ cat versions.txt
item2
item10
item1
$ sort versions.txt
item1
item10
item2

オプションなしのsortは文字列として辞書順にソートするため、item10item2より前に並んでしまう。-Vオプションを使用すると、数値部分を認識してバージョン番号として正しい順序でソートできる。

$ sort -V versions.txt
item1
item2
item10

セマンティックバージョニングのソート

-Vオプションは1.2.0のようなドット区切りのバージョン番号にも対応している。

$ cat semver.txt
app-1.10.0
app-1.2.0
app-1.9.0
app-2.0.0
$ sort semver.txt
app-1.10.0
app-1.2.0
app-1.9.0
app-2.0.0

文字列としてソートすると1.10.01.2.0より前に並んでしまうが、-Vオプションを使用するとメジャー、マイナー、パッチの各セグメントを数値として比較するため、意図した順序でソートできる。

$ sort -V semver.txt
app-1.2.0
app-1.9.0
app-1.10.0
app-2.0.0

応用: ログローテーションされたファイルのソート

logrotateなどでローテーションされたaccess.log.1access.log.2access.log.10のようなファイルも、-Vオプションでソートすると番号順に並べられる。

$ ls access.log*
access.log
access.log.1
access.log.10
access.log.2
access.log.9
$ ls access.log* | sort -V
access.log
access.log.1
access.log.2
access.log.9
access.log.10

なおlsコマンド自体にも同様の-vオプションがあり、ls -v access.log*でも同じ順序に並べられる。

補足

-VオプションはGNU拡張であり、GNU Coreutils 7.0 (2008年リリース) 以降で利用可能である。詳細はsort(1) - Linux manual page を参照。

指定したフィールドをキーにソートするには【sort -k】指定したフィールドをキーにソートする を参照。human readableな数値のソートについてはsortコマンドでhuman readableな数値をソートする を参照。