Bash中通配符的扩展是否保证按字母顺序排列? 我被迫将一个大文件分割成10Mb的部分,以便我们的Mercurial知识库可以接受它们。
所以我想我可以使用:
split -b 10485760 Big.file BigFilePiece.
然后代替:
cat BigFile | bigFileProcessor
我可以:
cat BigFilePiece.* | bigFileProcessor
在它的地方。
然而,我无法find任何可以确保星号(也称为通配符,aka *
)的扩展总是按照字母顺序排列的地方,以便.aa
在.ab
之前(相对于时间戳sorting或类似的东西)。
另外,我的计划中是否有缺陷? 收集文件的性能成本有多大?
是的,globbing扩展是按字母顺序的。
从Bash man
页:
path名称扩展
After word splitting, unless the -f option has been set, bash scans each word for the characters *, ?, and [. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of file names matching the pattern.
这是bash
logging行为,所以你可以在你的脚本中依赖它。 对于其他Bourne兼容的shell,在很长一段时间内也是如此……尽pipe可能存在关于案例折叠或非字母数字字符的angular落案例。
(所得到的列表在bash
中几乎是“ASCII-betical”顺序—除了小写字母和大写字母将被整理在一起,就好像没有任何区别,而是在小写字母大写之前进行整理。非字母表应按照它们在ASCII中出现的顺序排列)。
正如其他人指出的,这可能会受到您的语言相关的环境设置的干扰:一般LANG和LC_COLLATE更具体。 在env
命令下运行取决于全局扩展顺序的命令可能是最安全的(使用-i
或-u
来清除环境),或者通过sort
结果来确保强大的sorting。
虽然glob扩展按字母顺序sorting,但它们也遵循shell的语言设置。
如果你希望这是可移植的,请确保在脚本中将其设置为“C”。