bash 的 * 是否按字母数字顺序匹配文件?

the*_*ere 28 bash globbing

我想按文件名顺序将一堆文件连接在一起。

假设这会按字母数字顺序给我它们是否安全?

cat * 
Run Code Online (Sandbox Code Playgroud)

ls给出的相同顺序。

Pyl*_*lsa 28

简短回答:是的。

bash 手册页:

分词后,除非设置了 -f 选项(请参阅 Set Builtin),否则 Bash 会扫描每个单词以查找字符 '*'、'?' 和 '['。如果出现这些字符中的一个,则将该单词视为一个模式,并替换为与该模式匹配的按字母顺序排序的文件名列表。

  • 请注意,“字母”因区域设置而异(特别是`$LC_COLLATE`)。 (6认同)
  • @grawity true,但它会产生与同一系统上的 `ls` 相同的输出。 (4认同)

dtl*_*ier 11

简短的回答是肯定的,但您需要了解它认为字母数字顺序应该是什么,因为它可能与您心目中的自然顺序不符。

例如,运行一些关于如何处理大写和小写的测试以找出您的系统以及数字序列。

我在排序 glob 返回的文件列表时遇到的一个常见问题是编号文件。我经常收到编号如下的文件:

blah_1.txt
blah_2.txt
...
blah_10.txt
blah_11.txt
Run Code Online (Sandbox Code Playgroud)

但是,使用 的 glob*不会按此顺序返回它们,而是您会得到类似的信息:

blah_1.txt
blah_10.txt
blah_11.txt
...
blah_2.txt
blah_20.txt
...
Run Code Online (Sandbox Code Playgroud)

所以-避免这个问题你要么需要做的文件,或使个位数重命名的文件返回的列表上的一些操作有前导零(即blah_01.txtblah_02.txt等)。