Sle*_*led 65 files bash wildcard large-data
Bash 中通配符的扩展是否保证按字母顺序排列?我被迫将一个大文件分成 10 Mb 的部分,以便我的 Mercurial 存储库可以接受它们。
所以我想我可以使用:
split -b 10485760 Big.file BigFilePiece.
Run Code Online (Sandbox Code Playgroud)
然后代替:
cat BigFile | bigFileProcessor
Run Code Online (Sandbox Code Playgroud)
我可以:
cat BigFilePiece.* | bigFileProcessor
Run Code Online (Sandbox Code Playgroud)
在它的位置。
但是,我找不到任何可以保证星号(又名通配符,又名*
)的扩展始终按字母顺序排列的任何地方,因此.aa
出现在之前.ab
(而不是时间戳顺序或类似的东西)。
另外,我的计划有什么缺陷吗?cat
将文件放在一起的性能成本有多大?
Den*_*son 82
是的,globbing 扩展是按字母顺序排列的。
从Bash man
页面:
路径名扩展
词的拆分之后,除非该
-f
选项已被设置,bash将扫描的文字每个字*
,?
和[
。如果出现这些字符中的一个,则将该单词视为一个模式,并替换为与该模式匹配的按字母顺序排序的文件名列表。
它的行为已记录在案,bash
因此您可以在脚本中依赖它。很长一段时间以来,其他 Bourne 兼容 shell 也是如此……尽管可能存在有关大小写折叠或非字母数字字符的极端情况。
(结果列表bash
将几乎按“ASCII-betical”顺序排列 --- 除了小写和大写字母将被整理在一起,就好像没有大小写差异一样,但小写字母在其大写等效项之前整理。所有非- 字母顺序应按照 ASCII 中出现的顺序进行整理)。
正如其他人指出的那样,这可能会受到与语言相关的环境设置的干扰:一般是 LANG,更具体地说是 LC_COLLATE。在命令下运行依赖于全局扩展排序的命令可能是最安全的,env
以清除环境(使用-i
或-u
根据需要)或通过管道传输结果sort
以确保稳健的排序。