在linux的目录中查找与模式匹配的文件数

新手上路,请多包涵

我是 linux 新手。我在 linux 中有一个目录,其中包含大约 250,000 个文件,我需要找到与模式匹配的文件数。

我尝试使用以下命令:

 ls -1 20061101-20131101_kh5x7tte9n_2010_* | wc -l

我收到以下错误消息:

 -bash: /bin/ls: Argument list too long
0

请帮忙。提前致谢

原文由 db1 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 543
1 个回答

为此使用 find 可能会更好:

 find . -name "pattern_*" -printf '.' | wc -m

在您的具体情况下:

 find . -maxdepth 1 -name "20061101-20131101_kh5x7tte9n_2010_*" -printf '.' | wc -m

find 将返回符合条件的文件列表。 -maxdepth 1 将在路径中进行搜索,没有子目录( 感谢Petesh! )。 -printf '.' 将为每个匹配打印一个点,这样带有新行的名称就不会导致 wc -m 中断。

然后 wc -m 将指示与文件数匹配的字符数。


两种可能选项的性能比较:

让我们用这个模式创建 10 000 个文件:

 $ 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

find 快了 5 倍!但是如果我们使用 ls -1f再次感谢 Petesh! ),那么 ls 甚至比 find 还要快:

 $ time ls -1f | grep 20061101-20131101_kh5x7tte9n_201 | wc -m
10000

real    0m0.023s
user    0m0.020s
sys     0m0.012s

原文由 fedorqui 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题