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

db1*_*db1 22 regex linux bash ls find

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

我尝试使用以下命令:

ls -1 20061101-20131101_kh5x7tte9n_2010_* | wc -l
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

-bash: /bin/ls: Argument list too long
0
Run Code Online (Sandbox Code Playgroud)

请帮忙.提前致谢

fed*_*qui 45

使用它可能更好find:

find . -name "pattern_*" -printf '.' | wc -l
Run Code Online (Sandbox Code Playgroud)

在您的具体情况:

find . -maxdepth 1 -name "20061101-20131101_kh5x7tte9n_2010_*" -printf '.' | wc -m
Run Code Online (Sandbox Code Playgroud)

find将返回符合条件的文件列表.-maxdepth 1将使搜索只在路径中完成,没有子目录(感谢Petesh!).-printf '.'将为每个匹配打印一个点,以便具有新行的名称不会wc -m中断.

然后wc -m会指出行数.


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

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

$ for i in {1..10000}; do touch 20061101-20131101_kh5x7tte9n_201_$i; done
Run Code Online (Sandbox Code Playgroud)

然后比较使用ls -1 ...或获取结果所需的时间find ...:

$ time find . -maxdepth 1 -name "20061101-20131101_kh5x7tte9n_201_*" | wc -l
10000

real    0m0.034s
user    0m0.017s
sys     0m0.021s

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

real    0m0.254s
user    0m0.245s
sys     0m0.020s
Run Code Online (Sandbox Code Playgroud)

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

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

real    0m0.023s
user    0m0.020s
sys     0m0.012s
Run Code Online (Sandbox Code Playgroud)

  • 为了防止递归到子目录,你可以使用`-maxdepth 1`(如果在那个版本的find中支持它) (2认同)
  • ls在输出之前有排序的坏习惯,你应该用`ls -1 -f`进行测试,以获得与性能评估相似的行为 (2认同)
  • 如果你使用 `-printf '.'` 技巧,你应该计算字符数(`wc -m`)而不是行数。或者,在点之后添加一个换行符(`-printf '.\n'`)。 (2认同)

Odo*_*rus 6

你得到“参数太长”,因为 shell 将你的模式扩展到文件列表。尝试:

find  -maxdepth 1 -name '20061101-20131101_kh5x7tte9n_2010_*' |wc -l
Run Code Online (Sandbox Code Playgroud)

请注意 - 模式用引号括起来以防止 shell 扩展


Osc*_*car 5

做就是了:

find . -name "pattern_*" |wc -l
Run Code Online (Sandbox Code Playgroud)