$ for i in {1..10000}; do touch 20061101-20131101_kh5x7tte9n_201_$i; done
然后将得到结果所需的时间与ls -1 ...或find ...进行比较:
$ time find . -maxdepth 1 -name "20061101-20131101_kh5x7tte9n_201_*" | wc -m
10000
real 0m0.034s
user 0m0.017s
sys 0m0.021s
$ time ls -1 | grep 20061101-20131101_kh5x7tte9n_201 | wc -m
10000
real 0m0.254s
user 0m0.245s
sys 0m0.020s
8条答案
按热度按时间vsaztqbk1#
最好使用
find
:在您的具体情况下:
find
将返回符合条件的文件列表。-maxdepth 1
将使搜索只在路径中完成,没有子目录(感谢Petesh!-printf '.'
将为每个匹配项打印一个点,这样带有新行的名称就不会使wc -m
中断。然后
wc -m
将指示与文件数匹配的字符数。两种可能选择的性能比较:
让我们用这个模式创建10000个文件:
然后将得到结果所需的时间与
ls -1 ...
或find ...
进行比较:find
速度快了5倍!但是如果我们使用ls -1f
(再次感谢Petesh!),那么ls
甚至比find
更快:ghhkc1vu2#
你得到了“参数太长”,因为shell将你的模式扩展到文件列表。尝试:
请注意-图案用引号括起来,以防止 shell 膨胀
w8f9ii693#
MacOS / OS X命令行解决方案
如果你试图在Mac的命令行中执行此操作,你很快就会发现
find
does not support是-printf
选项。要实现与fedorqui-supports-monica提出的解决方案相同的结果,请尝试以下操作:
这将找到所有与您输入的模式匹配的文件,在新行中为每个文件打印
.
,然后最后计算行数并输出该数字。要将搜索深度限制在当前目录,请将
-maxdepth 1
添加到命令中,如下所示:vc6uscn94#
只要做:
bpzcxfmw5#
试试这个:
nqwrtyyt6#
你通常应该avoid
ls
in scripts,事实上,在shell函数中执行计算将避免“参数列表太长”错误,因为没有exec
边界,所以ARGV_MAX
限制不起作用。条件语句防止glob根本不展开(这是默认的;在Bash中,你可以用
shopt -s nullglob
把不匹配任何文件的通配符扩展成空字符串)。试试看:
js5cn81o7#
首先,根据this文章,最好不要使用
ls
!!!这个问题可以用很多方法来解决。我会列出一些我想到的最优雅的。
但是当文件名包含空格时,最后一个给出了错误的数字。
wooyq4lh8#
以前的答案也没有包括搜索标准的引用。