Pao*_*olo 5 bash shell-script sort wildcards
我编写了一个 bash 脚本来处理文件名列表(使用 glob 扩展,如for f in *
),然后将该列表的一个子集输出到文件中。随后,我将这个文件的内容读入一个数组,并使用明显的<
和>
运算符来比较字符串,对特定文件名执行简单的二进制搜索。
考虑到我希望脚本能够在 Linux、MacOS、MinGW 等许多不同的环境中工作……(即使它使用诸如[[
和stat
不太便携的东西),我的问题是:
sort
或额外的 bash 代码)或者 glob 扩展是否总是排序 - 在每个环境中?条件运算符是否使用与扩展(或之后sort
)相同的“排序” ?
扩展或sort
返回file10.txt
之后file2.txt
(在什么情况下?)但使用条件运算符file10.txt
会在之前file2.txt
?我sort
会用什么选项来解决这个问题?
如果我的某些文件名是 Unicode,有什么注意事项吗?
LC_COLLATE
影响上述任何一项? 我显然需要文件内容来匹配运算符的排序“方法”,以便二分搜索按预期工作......
小智 3
是的,全局扩展总是经过排序的。
\n在 bash 中(来自LESS=+/\'^ *Pathname Expansion\' man bash
)
\n\n\n路径名扩展\n ... 该单词被视为一种模式,并替换为与该模式匹配的按字母顺序排序的文件名列表。
\n
这也是由 POSIX glob 指定的:
\n\n\n\n\n...路径名按 LC_COLLATE 类别的当前设置定义的排序顺序排列。
\n
注1:除非GLOB_NOSORT
设置了标志。在这种情况下,顺序是未指定的。
注2:排序顺序为字母顺序(不是数字),10 排在 2 之前。
\n\n\n\n\n\n
\n- 我是否需要对文件内容进行排序(使用排序或附加 bash 代码)...
\n
Globing 与文件内容无关,仅适用于文件名。
\n如果您需要对“文件内容”进行排序,那么,是的,您确实需要调用sort
use 相当多的bash
代码。
\n\n\n\n
\n- ...或者全局扩展总是排序的 - 在每个环境中?
\n
除非禁用,否则GLOB_NOSORT
Globing 的结果将LC_COLLATE
按照环境中排序顺序(变量)定义的顺序进行排序。
要具有相同的排序顺序,您必须具有相同的有效排序规则。两者都设置LC_COLLATE
变量并具有locale
包含相同整理详细信息的描述。
\n\n\n\n
\n- 条件运算符是否使用与扩展(或排序后)相同的“排序”?
\n
是的。两者都受到相同的影响LC_COLLATE
。
\n\n\n\n
\n- 扩展或排序是否会在 file2.txt 之后返回 file10.txt (在什么情况下?),但使用条件运算符 file10.txt 将在 file2.txt 之前?我将使用什么排序选项来解决这个问题?
\n
10
before的结果2
是“字典顺序”,与 bash 手册描述中所谓的“字母顺序”相同。因此,如果您使用 bash(或任何 POSIX shell)进行排序,这就是您将得到的顺序(在所有情况下)。这没有错,所以它是不可修复的(对于文本)。
但是,如果您选择使用sort
(外壳外部的外部工具),您可能会要求numeric
排序(-n 选项),它将2
放在10
. 或者您可以从文本中提取数字并使用它们-lt
-gt
在 shell 中进行整数比较(整数运算符)。
\n\n\n如果我的某些文件名采用 Unicode,有什么注意事项吗?
\n
主要是:整理顺序不固定。
\n\n它随时间和 UNICODE 版本而变化。
\n\n可能发生的情况是,您用某种您不熟悉的语言得到一些令人惊讶的结果。例如:
\n\n\n\n简而言之:\xc2\xbb 准备好感到惊讶\xc2\xab。
\n\n\n\n\n使用特定版本的 bash 是否存在任何问题?
\n
嗯,你必须使用2.0以上的bash版本
\n\nrespect LC_COLLATE 2.0 \n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n\nLC_COLLATE 会影响上述任何一个吗?
\n
该变量LC_COLLATE
影响上述所有内容。