计算子目录中匹配模式的文件的脚本

use*_*522 2 shell shell-script recursive files

我编写了以下脚本,用于从当前目录中查找 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
Run Code Online (Sandbox Code Playgroud)

Chr*_*own 11

你可以在 pure 中做到这一点bash

shopt -s nullglob dotglob globstar
set -- **/*.pdf **/*.tex
echo "$#"
Run Code Online (Sandbox Code Playgroud)

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

如果您确实使用了位置参数(与查询者案例中的脚本不同),那么您可以使用数组执行相同的操作:

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


kev*_*kev 7

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
Run Code Online (Sandbox Code Playgroud)

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

$ find . \( -name '*.pdf' -o -name '*.tex' \) -printf x | wc -c
Run Code Online (Sandbox Code Playgroud)