功能

功能

如果我有多个目录,例如10001通过命名,10025有什么理由使用ls 1*/foovs 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

这是原始数据*。同样,我没有检测到显着差异(p 值 = 0.55),并且每个测试的分布看起来更相似。

图2

答案2

??如果 glob 存在或可能存在其他更长的文件,则这些文件更加具体*

% touch 10001 100dalmations
% ls 100??
10001
% ls 100*
10001  100dalmations
% 

相关内容