如果我有多个目录,例如命名为10001
through10025
是否有任何理由使用ls 1*/foo
vs. ls 100??/foo
?
我有超过 25 个,所以我很好奇速度上是否有任何差异。
我知道两者在使用上的区别,星号会匹配更长的文件名,比如10001.backup
. 但是假设我没有任何不符合我的约定的文件。是否有任何幕后差异?
它们的意思不同。该星号匹配零到无穷大的字符。该问号与一个字符匹配。
从上面的参考:
* 字符用作通配符中文件名扩展的“通配符”。
这 ?字符用作通配符中文件名扩展的单字符“通配符”......
tl; dr:性能上没有可检测到的差异。
我通过使用一个包含 36 个子目录的目录来测试性能,每个子目录都用一个字符命名。合并后的子目录中大约有 70 000 个文件。我测试了以下内容。
$ time ls ?/* -d >/dev/null
$ time ls */* -d >/dev/null
Run Code Online (Sandbox Code Playgroud)
我每个命令交替执行十次。这是real
时间的结果,以秒为单位。
? *
0.318 0.326
0.355 0.212
0.291 0.351
0.291 0.265
0.287 0.283
0.362 0.23
0.248 0.33
0.286 0.283
0.293 0.351
0.233 0.352
Run Code Online (Sandbox Code Playgroud)
经过统计分析(配对 t 检验,双尾),我无法检测到两个值之间的性能差异(p 值 = 0.95)。
我用 200 个样本重复了上述分析,再次交替测试。
$ for i in {1..200}; do time (ls */* -d >/dev/null) 2>> /tmp/time_asterisk; time (ls ?/* -d >/dev/null) 2>> /tmp/time_question_mark; done
Run Code Online (Sandbox Code Playgroud)
这是原始数据?和*。同样,我无法检测到显着差异(p 值 = 0.55),并且每个测试的分布看起来更相似。