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)
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)