Bash 中通配符的扩展是否保证按字母顺序排列?我不得不将一个大文件拆分成 10 Mb 的块,以便我的 Mercurial 存储库可以接受它们。
所以我想我可以使用:
split -b 10485760 Big.file BigFilePiece.
然后代替:
cat BigFile | bigFileProcessor
我可以做:
cat BigFilePiece.* | bigFileProcessor
取而代之。
但是,我找不到任何地方可以保证星号(又名通配符,又名*
)的扩展始终按字母顺序排列.aa
(.ab
而不是按时间戳排序或类似顺序排列)。
cat
另外,我的方案有什么缺陷吗?将文件合并在一起的性能成本有多大?
答案1
是的,通配符扩展是按字母顺序排列的。
来自猛击 man
页:
路径名扩展
在单词拆分之后,除非
-f
已设置选项,否则 bash 会扫描每个单词以查找字符*
、?
和[
。 如果出现其中一个字符,则该单词将被视为模式,并替换为按字母顺序排序的与该模式匹配的文件名列表。
答案2
它的行为已记录在案,bash
因此您可以在脚本中依赖它。其他与 Bourne 兼容的 shell 也已经这样做了很长时间……尽管可能存在与大小写折叠或非字母数字字符有关的极端情况。
(结果列表将bash
几乎按照“ASCII 顺序”排序 --- 除了大小写字母将一起排序,好像没有大小写差异,但小写字母先于大写字母排序。所有非字母表的顺序都应与它们在 ASCII 中出现的顺序相同)。
正如其他人指出的那样,这可能会受到语言相关环境设置的干扰:一般是 LANG,更具体地说是 LC_COLLATE。最安全的做法可能是在命令下运行依赖于 glob 扩展排序的命令env
来清除环境(根据需要使用-i
或-u
)或通过管道传输结果sort
以确保可靠的排序。
答案3
虽然 glob 扩展按字母顺序排序,但它们也遵循 shell 的语言设置。
如果您希望将其移植,请确保在脚本中将其设置为“C”。