如果我有多个目录,例如10001
通过命名,10025
有什么理由使用ls 1*/foo
vs ls 100??/foo
?
我有超过 25 个,所以我主要好奇速度上是否有任何差异。
我知道两者在使用上的区别,星号将匹配更长的文件名,例如10001.backup
.但假设我没有任何不符合我的约定的文件。幕后有什么差异吗?
答案1
功能
它们的含义不同。这星号匹配零到无穷大的字符。这问号恰好匹配一个字符。
从上面的参考资料来看:
* 字符在通配符中充当文件名扩展的“通配符”。
这 ?字符充当单字符“通配符”,用于通配中的文件名扩展...
表现
tl;dr:性能上没有可察觉的差异。
我使用一个包含 36 个子目录的目录来测试性能,每个子目录都以单个字符命名。子目录中总共约有 70 000 个文件。我测试了以下内容。
$ time ls ?/* -d >/dev/null
$ time ls */* -d >/dev/null
我每个命令交替十次。以下是当时的结果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
经过统计分析(配对 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
答案2
??
如果 glob 存在或可能存在其他更长的文件,则这些文件更加具体*
。
% touch 10001 100dalmations
% ls 100??
10001
% ls 100*
10001 100dalmations
%