在 bash 中,如何对包含数字的字符串进行排序?

ngm*_*ngm 41 linux bash sorting

如果我在目录中有这些文件

cwcch10.pdf
cwcch11.pdf
cwcch12.pdf
cwcch13.pdf
cwcch14.pdf
cwcch15.pdf
cwcch16.pdf
cwcch17.pdf
cwcch18.pdf
cwcch1.pdf
cwcch2.pdf
cwcch3.pdf
cwcch4.pdf
cwcch5.pdf
cwcch6.pdf
cwcch7.pdf
cwcch8.pdf
cwcch9.pdf
Run Code Online (Sandbox Code Playgroud)

如何在 Bash 中列出它们,以便它们根据字符串的数字部分按数字升序排列。所以产生的顺序是cwcch1.pdf, cwcch2.pdf, ..., cwcch9.pdf, cwcch10.pdf,等等。

我最终要做的是将 pdf 与pdftk以下内容连接起来

pdftk `ls *.pdf | sort -n` cat output output.pdf
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为我的排序错误。

Den*_*son 71

sort可能有能力为您执行此操作:

sort --version-sort
Run Code Online (Sandbox Code Playgroud)


lar*_*sks 33

对于这个特定的例子,你也可以这样做:

ls *.pdf | sort -k2 -th -n
Run Code Online (Sandbox Code Playgroud)

也就是说,使用“h”作为字段分隔符 (-th) 在第二个字段 (-k2) 上按数字 (-n) 排序。


ret*_*ile 9

像这样的事情可能会做你想做的事,尽管它需要一种稍微不同的方法:

pdftk $(for n in {1..18}; do echo cwcch$n.pdf; done) cat output output.pdf
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以使用-vGNU 中的选项ls:文本中自然排序的(版本)编号。

ls -1v cwcch*
Run Code Online (Sandbox Code Playgroud)

这不适用于 BSD ls(例如在 OS X 上),其中该-v选项具有不同的含义。