Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在linux中查找目录中与模式匹配的文件计数_Regex_Linux_Bash_Find_Ls - Fatal编程技术网

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

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 在您的具体情况

我是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
在您的具体情况下:

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_*