路径名扩展

路径名扩展

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”。

相关内容