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

zpgglvta  于 2023-10-16  发布在  Linux
关注(0)|答案(8)|浏览(115)

我是Linux新手。我在Linux中有一个目录,大约有250,000个文件,我需要找到匹配模式的文件数量计数。
我尝试使用以下命令:

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

我收到了以下错误消息:

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

请帮帮我Thanks in advance

vsaztqbk

vsaztqbk1#

最好使用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将指示与文件数匹配的字符数。
两种可能选择的性能比较:
让我们用这个模式创建10000个文件:

$ 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
ghhkc1vu

ghhkc1vu2#

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

find  -maxdepth 1 -name '20061101-20131101_kh5x7tte9n_2010_*' |wc -l

请注意-图案用引号括起来,以防止 shell 膨胀

w8f9ii69

w8f9ii693#

MacOS / OS X命令行解决方案

如果你试图在Mac的命令行中执行此操作,你很快就会发现finddoes not support-printf选项。
要实现与fedorqui-supports-monica提出的解决方案相同的结果,请尝试以下操作:

find . -name "pattern_*" -exec stat -f "." {} \; | wc -l

这将找到所有与您输入的模式匹配的文件,在新行中为每个文件打印.,然后最后计算行数并输出该数字。

要将搜索深度限制在当前目录,请将-maxdepth 1添加到命令中,如下所示:

find . -maxdepth 1 -name "196288.*" -exec stat -f "." {} \; | wc -l
vc6uscn9

vc6uscn94#

只要做:

find . -name "pattern_*" |wc -l
bpzcxfmw

bpzcxfmw5#

试试这个:

ls -1 | grep 20061101-20131101_kh5x7tte9n_2010_ | wc -l
nqwrtyyt

nqwrtyyt6#

你通常应该avoid ls in scripts,事实上,在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_*
js5cn81o

js5cn81o7#

首先,根据this文章,最好不要使用ls!!!

这个问题可以用很多方法来解决。我会列出一些我想到的最优雅的。

count=$(printf '%s\n' *pattern* | wc -l) 
#or
count=$(shopt -s nullglob; files=(*pattern*); echo ${#files[@]})
#or
count=$(file *pattern* | wc -l)
#or
count=$(stat -c "%n" *pattern* | wc -l)
#or
count=$(du -a *pattern* | wc -l)
#or
count=$(echo *pattern* | wc -w)

但是当文件名包含空格时,最后一个给出了错误的数字。

wooyq4lh

wooyq4lh8#

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

以前的答案也没有包括搜索标准的引用。

相关问题