在 Bash 中,通配符扩展是否保证有序?

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将扫描的文字每个字*?[。如果出现这些字符中的一个,则将该单词视为一个模式,并替换为与该模式匹配的按字母顺序排序的文件名列表。

  • @Zoredache:它实际上是由 POSIX 指定的:http://opengroup.org/onlinepubs/007908775/xsh/glob.html“路径名按 LC_COLLATE 类别的当前设置定义的排序顺序,请参阅 XBD 规范 LC_COLLATE [http://opengroup.org/onlinepubs/007908775/xbd/locale.html#tag_005_003_002]”这就是为什么你应该做类似`ls -l [[:lower:]]`而不是`ls -l [az ]`。 (8认同)
  • @ArtOfWarfare:试试这个:`mkdir lctest; cd lctest; 触摸 w; 触摸 z; ls -l [:下:]; 回声======; ls -l [[:lower:]]`。"z" 文件仅在第二个 `ls` 中列出,因为它要求使用小写的单字母文件名。第一个 `ls` - 没有外方括号的那个 - 要求从字符列表“:”、“l”、“o”、“w”、“e”和“r”中获取单字符文件名”。在这两种情况下,最外面的方括号界定了一个列出字符和类的括号表达式。在`[[:lower:]]`的情况下,内部方括号、冒号和单词命名一个字符类。... (2认同)

Jim*_*nis 6

它的行为已记录在案,bash因此您可以在脚本中依赖它。很长一段时间以来,其他 Bourne 兼容 shell 也是如此……尽管可能存在有关大小写折叠或非字母数字字符的极端情况。

(结果列表bash将几乎按“ASCII-betical”顺序排列 --- 除了小写和大写字母将被整理在一起,就好像没有大小写差异一样,但小写字母在其大写等效项之前整理。所有非- 字母顺序应按照 ASCII 中出现的顺序进行整理)。

正如其他人指出的那样,这可能会受到与语言相关的环境设置的干扰:一般是 LANG,更具体地说是 LC_COLLATE。在命令下运行依赖于全局扩展排序的命令可能是最安全的,env以清除环境(使用-i-u根据需要)或通过管道传输结果sort以确保稳健的排序。

  • 似乎所有非字母数字在排序过程中都被“忽略”。因此,“=”、“_”、“~”不能用于强制文件(分别)开始或结束列表。 (5认同)