用于计算子目录中匹配模式的文件数量的脚本

用于计算子目录中匹配模式的文件数量的脚本

我编写了以下脚本,用于查找当前目录(包括子目录和隐藏文件)中 pdf 和 tex 文件的数量。下面的代码能够找到下面2级子目录下的pdf文件的数量,但是之后它告诉我们没有子目录......

#!/bin/bash

touch t.txt

k=`find -type d |wc -l`
k1=`expr $k - 1`

echo $k1

message1="*.pdf *.tex"
count=`ls -al $message1|wc -l`
find -type d > t.txt

i=2

while [ $i -le $k ]
do
    kd=`head -$i t.txt|tail -1`
    echo $kd
    touch $kd/t.txt
    cp t.txt $kd/t.txt
    i=`expr $i + 1`
done

i=2
while [ $i -le $k ]
do
    nd=`head -$i t.txt|tail -1`
    set -x
    echo $nd
    set +x
    cd $nd
    j=`ls -al $message1|wc -l`
    count=`expr $count + $j`
    i=`expr $i + 1`
done
#set +x

echo $count

答案1

你可以用纯粹的方式做到这一点bash

shopt -s nullglob dotglob globstar
set -- **/*.pdf **/*.tex
echo "$#"

set将当前 shell 的位置参数设置为 glob 的结果。$#然后检索这些参数集的数量。

如果你使用位置参数(与查询者情况下的脚本不同),那么您可以使用数组执行相同的操作:

shopt -s nullglob dotglob globstar
files=(**/*.pdf **/*.tex)
echo "${#files[@]}"

答案2

find对我来说效果很好:

$ find . -name '*.pdf' -o -name '*.tex' | wc -l
75
$ find . -name '*.pdf' | wc -l
16
$ find . -name '*.tex' | wc -l
59
$ echo $((16+59))
75

编辑:
处理特殊情况:newline在文件名中

$ find . \( -name '*.pdf' -o -name '*.tex' \) -printf x | wc -c

答案3

我建议(如果可用)使用locate而不是查找。您将查询数据库,结果将是即时的,并且系统实际上没有负载。虽然数据库仅在系统运行时更新,updatedb所以如果您想要第二个信息,您必须确保首先运行它,这会给系统带来负载,但这取决于您打算如何使用您的系统搜索。

您可以使用任何满足您需求的正则表达式。

system1:/unix.stackexchange # locate *.tex *.pdf | grep unix.stack.*
   /unix.stackexchange/access_me/1/file.pdf
   /unix.stackexchange/access_me/1/file.tex

相关内容