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

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

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

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

我如何在 Bash 中列出它们,以便它们根据字符串的数字部分按升序排列。因此,结果顺序为cwcch1.pdf, cwcch2.pdf, ..., cwcch9.pdf, cwcch10.pdf,等等。

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

pdftk `ls *.pdf | sort -n` cat output output.pdf

但由于我的排序错误,所以这不起作用。

答案1

类似这样的事情可能会做你想做的事,尽管它采用了略有不同的方法:

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

答案2

sort可能有能力为您做到这一点:

sort --version-sort

答案3

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

ls *.pdf | sort -k2 -th -n

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

答案4

在命令行中直接使用 shell 扩展。扩展应该正确排序。如果我pdftk正确理解了命令行语法,这将满足您的要求:

# shell expansion with square brackets
pdftk cwcch[1-9].pdf cwcch1[0-9].pdf cat output output.pdf

# shell expansion with curly braces
pdftk cwcch{{1..9},{10..18}}.pdf cat output output.pdf

或者您可以尝试不同的方法。当我需要做这样的事情时,我通常会提前尝试正确格式化我的数字。如果我迟到了,并且 PDF 已经像您的示例一样编号,我将使用它来重新编号:

# rename is rename.pl aka prename -- perl rename script
# this adds a leading zero to single-digit numbers
rename 's/(\d)/0$1/' cwcch[1-9].pdf

现在标准ls排序将正常工作。

相关内容