Regex 在linux中查找目录中与模式匹配的文件计数
我是linux新手。我在linux中有一个目录,大约有250000个文件 我需要找到匹配模式的文件数 我尝试使用以下命令:Regex 在linux中查找目录中与模式匹配的文件计数,regex,linux,bash,find,ls,Regex,Linux,Bash,Find,Ls,我是linux新手。我在linux中有一个目录,大约有250000个文件 我需要找到匹配模式的文件数 我尝试使用以下命令: ls -1 20061101-20131101_kh5x7tte9n_2010_* | wc -l 我收到以下错误消息: -bash: /bin/ls: Argument list too long 0 请帮忙。提前感谢为此,最好使用find: find . -name "pattern_*" -printf '.' | wc -m 在您的具体情况
ls -1 20061101-20131101_kh5x7tte9n_2010_* | wc -l
我收到以下错误消息:
-bash: /bin/ls: Argument list too long
0
请帮忙。提前感谢为此,最好使用
find
:
find . -name "pattern_*" -printf '.' | wc -m
在您的具体情况下:
find . -maxdepth 1 -name "20061101-20131101_kh5x7tte9n_2010_*" -printf '.' | wc -m
find
将返回符合条件的文件列表-maxdepth 1
将使搜索仅在路径中完成,而不在子目录()中完成-printf'.
将为每个匹配项打印一个点,这样带有新行的名称就不会使wc-m中断
然后,wc-m
将指示与文件数匹配的字符数
两种可能方案的性能比较: 让我们使用此模式创建10000个文件:
$ for i in {1..10000}; do touch 20061101-20131101_kh5x7tte9n_201_$i; done
然后将获得结果所需的时间与ls-1…
或查找…
进行比较:
$ 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
查找
速度快5倍!但是如果我们使用ls-1f
(),那么ls
甚至比find
更快:
$ time ls -1f | grep 20061101-20131101_kh5x7tte9n_201 | wc -m
10000
real 0m0.023s
user 0m0.020s
sys 0m0.012s
试试这个:
ls -1 | grep 20061101-20131101_kh5x7tte9n_2010_ | wc -l
您得到了“参数太长”,因为shell将您的模式扩展到文件列表。
尝试:
请注意-图案用引号括起来,以防外壳膨胀
ls -1 | grep '20061101-20131101_kh5x7tte9n_2010_*' | wc -l
以前的答案没有在搜索条件周围加引号,也没有加*通配符。通常,在shell函数中执行计算将避免“参数列表过长”错误,因为没有exec
边界,因此ARGV_MAX
限制不起作用
number_of_files () {
if [ -e "$1" ]; then
echo "$#"
else
echo 0
fi
}
条件保护防止glob完全不被扩展(这是默认的开箱即用;在Bash中,您可以shopt-s nullglob
将与任何文件都不匹配的通配符扩展为空字符串)
试试看:
number_of_files 20061101-20131101_kh5x7tte9n_2010_*
MacOS/OSX命令行解决方案
如果您试图在Mac上的命令行中执行此操作,您很快就会发现find
是-printf
选项
要获得与所提出的解决方案相同的结果,请尝试以下操作:
find-名称为“pattern_*.-exec stat-f”。{}\|wc-l
这将找到与您输入的模式匹配的所有文件,在换行中为每个文件打印一个
,然后最后计算行数并输出该数字
要将搜索深度限制到当前目录,请向命令中添加-maxdepth 1
,如下所示:
find-maxdepth 1-名称“196288.*”-exec stat-f“{}\;|wc-l
为了防止递归到子目录中,您可以使用-maxdepth 1
(如果该版本的find支持)ls在输出前有排序的坏习惯,您应该使用ls-1-f
进行测试,以获得与find类似的性能评估行为非常有趣,@Petesh不知道这一点。我已经测试了性能,对我来说,使用ls-1f
比find
更快。如果使用-printf'.
技巧,你应该计算字符(wc-m
)而不是行数。或者,在点(-printf'.\n'
)后添加一个换行符。使用--count
(-c
)进行grep
和跳过wc
如何?我希望性能有所提高。(也是一个更简单的表达式。)然后,出于同样的原因,我希望find
with-name
比ls | grep
更快,但显然不是……这基本上是重复前面的答案,而且不会起作用。这会混淆shell通配符和正则表达式grep
支持后者,并且将在任何子字符串上找到匹配项,因此尾部通配符是不必要的,也不代表您的想法。我支持在正则表达式周围使用引号的想法,但在这种情况下,这是不必要的,不正确的正则表达式会破坏答案。对于记录,通配符*
(不得引用)对应于正则表达式*
number_of_files 20061101-20131101_kh5x7tte9n_2010_*