在Bash中,是否可以保证通配符扩展正常?


53

是否可以确保Bash中的通配符扩展按字母顺序排列?我被迫将一个大文件分成10 Mb,以便我的Mercurial存储库可以接受它们。

所以我想我可以使用:

split -b 10485760 Big.file BigFilePiece.

然后代替:

cat BigFile | bigFileProcessor

我可以做:

cat BigFilePiece.* | bigFileProcessor

代替它。

但是,我找不到任何地方这保证了星号(又名通配符,又名膨胀*)将永远是按字母顺序排列,这样.aa来之前.ab(而不是被戳订购或类似的东西)。

另外,我的计划中是否有任何缺陷?cat一起读取文件的性能成本有多少?


4
当然,您采用的是错误的方法。如果管理员对存储库中文件的大小设置了限制,则应与他联系。关于扩展-我一直看到扩展是字母数字的。
Mircea Vutcovici

1
sort如果您需要任何其他订单操作,则始终可以通过管道进行浏览。
华纳2010年

2
请注意,Mercurial可以管理任何大小的文件,受您拥有的RAM数量限制。如果添加大文件,则会收到警告,因为Mercurial假定它可以将文件保存在内存中。对于合并,Mercurial需要在内存中保存两个文件。因此,具有少量RAM的计算机可能无法检出文件。我刚刚对其进行了测试,并且hg commitNMB文件上需要大约3 * NMB RAM,并且hg update大约需要2 * NMB RAM。这是Linux上的Mercurial 1.5。
马丁·盖斯勒

Answers:


67

是的,全局扩展是按字母顺序进行的。

在Bash man页面中:

路径名扩展

词的拆分之后,除非该-f选项已被设置,bash将扫描的文字每个字*?[。如果出现这些字符之一,则将该单词视为一个模式,并替换为与该模式匹配的按字母顺序排序的文件名列表。


@Dennis Williamson,如果用户设置了其他语言集,这是否仍然适用?
Zoredache

5
@Zoredache:它实际上是由POSIX指定的:opengroup.org/onlinepubs/007908775/xsh/glob.html “路径名按LC_COLLATE类别的当前设置所定义的排序顺序,请参阅XBD规范LC_COLLATE [ opengroup.org / onlinepubs / 007908775 / xbd /… ”,这就是为什么您应该执行类似ls -l [[:lower:]]而不是的原因ls -l [a-z]
丹尼斯·威廉姆森

需要注意的是顺序是按字母顺序排列,以便将BigFilePiece.10前BigFilePiece.2来
肯·

@DennisWilliamson-为什么两对方括号?一个人似乎对我完全一样。
ArtOfWarfare

2
@ArtOfWarfare:尝试:mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]。“ z”文件仅在第二个位置列出,ls因为它要求使用小写的单字母文件名。第一个ls-没有外部方括号的-是从字符“:”,“ l”,“ o”,“ w”,“ e”和“ r”列表中询问单字符文件名。在这两种情况下,最外面的方括号定了一个括号表达式,其中列出了字符和类。对于[[:lower:]],内部方括号,冒号和单词为字符类。...
丹尼斯·威廉姆森

4

它的行为已记录在案,bash因此您可以在脚本中依赖它。在很长一段时间内,其他Bourne兼容外壳也是如此,尽管在某些情况下可能会遇到折叠或非字母数字字符的情况。

(结果列表bash几乎按“ ASCII字符”顺序排列,除了小写和大写字母将被整理在一起,就好像没有大小写差异,而小写字母则在大写字母之前进行了整理。所有非-alphabetics的整理顺序应与ASCII中出现的顺序相同)。

正如其他人指出的那样,这可能会受到您与语言相关的环境设置的干扰:通常为LANG,更具体地说为LC_COLLATE。使用in来运行取决于glob扩展顺序的env命令可能是最安全的,该命令在命令下清除环境(使用-i-u适当使用)或通过管道传递结果sort以确保可靠的排序。


4
看来在排序过程中所有非字母数字都被忽略了。因此,不能使用“ =”,“ _”,“〜”来强制文件分别开始或结束列表。
Otheus 2012年

3

尽管全局扩展按字母顺序排序,但它们也遵循外壳的语言设置。

如果您打算将其便携式,请确保在脚本中将其设置为“ C”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.