簡體   English   中英

如何按版本號對文件名進行排序?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM