[英]How can I sort file names by version numbers?
在目錄“data”中是這些文件:
command-1.9a-setup
command-2.0a-setup
command-2.0c-setup
命令 2.0-設置
我想對文件進行排序以獲得此結果:
command-1.9a-setup
命令 2.0-設置
command-2.0a-setup
command-2.0c-setup
我試過這個
find /data/ -name 'command-*-setup' | sort --version-sort --field-separator=- -k2
但輸出是
command-1.9a-setup
command-2.0a-setup
command-2.0c-setup
命令 2.0-設置
我發現給我想要的輸出的唯一方法是
tree -v /data
我怎樣才能按照想要的順序對輸出進行排序?
編輯:事實證明 Benoit 走在正確的軌道上,而 Roland 打破了平衡
您只需要告訴sort
只考慮字段 2(添加“,2”):
find ... | sort --version-sort --field-separator=- --key=2,2
原答案:無視
如果您的文件名中的連字符之間都不包含空格,您可以嘗試以下操作:
find ... | sed 's/.*-\([^-]*\)-.*/\1 \0/;s/[^0-9] /.&/' | sort --version-sort --field-separator=- --key=2 | sed 's/[^ ]* //'
第一個sed
命令使行看起來像這樣(我添加了“10”以表明排序是數字):
1.9.a command-1.9a-setup
2.0.c command-2.0c-setup
2.0.a command-2.0a-setup
2.0 command-2.0-setup
10 command-10-setup
額外的點使字母后綴的版本號在沒有后綴的版本號之后排序。 第二個sed
命令從每一行中刪除帶前綴的版本號。
有很多方法可能會失敗。
如果您指定排序只考慮第二個字段 ( -k2
),請不要抱怨它不考慮第三個字段。
在你的情況下,運行sort --version-sort
沒有任何其他參數,也許這會更適合。
看起來像這樣:
find /data/ -name 'command-*-setup' | sort -t - -V -k 2,2
不是排序,但它有效:
tree -ivL 1 /data/ | perl -nlE 'say if /\Acommand-[0-9][0-9a-z.]*-setup\z/'
-v:按版本對輸出進行排序
-i:使樹不打印縮進線
-L level:目錄樹的最大顯示深度
舊帖子,但是... ls -l --sort=version
可能會有所幫助(盡管對於 OP 的示例,排序與ls -l
在 RHEL 7.2 中所做的相同):
command-1.9a-setup
command-2.0a-setup
command-2.0c-setup
command-2.0-setup
YMMV 我猜。
另一種方法是填充您的數字。
本示例將所有數字填充為 8 位數字。 然后,它進行簡單的字母數字排序。 然后,它移除墊。
$ pad() { perl -pe 's/(\d+)/0000000\1/g' | perl -pe 's/0*(\d{8})/\1/g'; }
$ unpad() { perl -pe 's/0*([1-9]\d*|0)/\1/g'; }
$ cat files | pad | sort | unpad
command-1.9a-setup
command-2.0-setup
command-2.0a-setup
command-2.0c-setup
command-10.1-setup
為了深入了解這是如何工作的,讓我們看一下填充后的排序結果:
$ cat files | pad | sort
command-00000001.00000009a-setup
command-00000002.00000000-setup
command-00000002.00000000a-setup
command-00000002.00000000c-setup
command-00000010.00000001-setup
您會看到,所有數字都很好地填充為 8 位數字,字母數字排序將文件名按所需順序排列。
$ cat files
command-1.9a-setup
command-2.0c-setup
command-10.1-setup
command-2.0a-setup
command-2.0-setup
$ cat files | sort -t- -k2,2 -n
command-1.9a-setup
command-2.0-setup
command-2.0a-setup
command-2.0c-setup
command-10.1-setup
$ tac files | sort -t- -k2,2 -n
command-1.9a-setup
command-2.0-setup
command-2.0a-setup
command-2.0c-setup
command-10.1-setup
我在文件夾中有文件,需要根據編號按排序順序獲取這些名稱。 例如——
abc_dr-1.txt
hg_io-5.txt
kls_er_we-3.txt
sd-4.txt
sl_rt_we_yh-2.txt
我需要根據數字對它們進行排序。 所以我用這個來排序。
ls -1 | sort -t '-' -nk2
它根據數字按排序順序給了我文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.