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

split -b 10485760 Big.file BigFilePiece.


我可以做:

cat BigFile | bigFileProcessor


代替它。

但是,我找不到能保证星号(又称通配符,又称*)的扩展始终按字母顺序排列的地方,因此.aa早于.ab(相对于是时间戳记订购之类的东西。)

此外,我的计划中是否有任何缺陷? cat一起执行文件的性能成本有多高?

评论

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

如果需要任何其他顺序操作,则始终可以通过排序进行管道传递。

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

#1 楼

是的,通配符扩展是按字母顺序进行的。选项已设置,bash扫描每个单词man-f*。如果出现这些字符之一
,则将该单词视为一个模式,并替换为与该模式匹配的文件名称的按字母顺序排序的
列表。

评论


@Dennis Williamson,如果用户设置了不同的语言集,这是否仍然适用?

– Zoredache
2010-03-15 22:35



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

–丹尼斯·威廉姆森
10 Mar 16 '10 at 0:31

请注意,该顺序是按字母顺序排列的,因此BigFilePiece.10将排在BigFilePiece.2之前

–肯
14年7月24日在13:14

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

–ArtOfWarfare
18年3月14日在21:08

@ArtOfWarfare:尝试一下:mkdir lctest; cd lctest;触摸w;触摸z; ls -l [:lower:];回声=====; ls -l [[:lower:]]。 “ z”文件仅在第二个ls之前列出,因为它要求使用小写的单字母文件名。第一个ls(不带方括号的字符)从字符“:”,“ l”,“ o”,“ w”,“ e”和“ r”列表中询问单字符文件名。在这两种情况下,最外面的方括号定界了一个括号表达式,其中列出了字符和类。在[[:: lower:]]的情况下,内部方括号,冒号和单词为字符类。 ...

–丹尼斯·威廉姆森
18年3月15日在17:06

#2 楼

它是bash的行为记录,因此您可以在脚本中依赖它。在很长一段时间内,其他Bourne兼容外壳也是如此……尽管可能存在与大小写折叠或非字母数字字符有关的特殊情况。
以几乎“ ASCII字母”的顺序---区别在于小写和大写字母将被整理到一起,就好像没有大小写差异一样,只是小写字母在它们的大写等价物之前被整理。 (以ASCII格式显示)。

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

评论


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

–奥修斯
2012年1月20日上午11:46

#3 楼

当glob扩展按字母顺序排序时,它们也遵循外壳的语言设置。