현재 디렉터리(하위 디렉터리 및 숨김 파일 포함)에 있는 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
현재 쉘의 위치 매개변수를 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
(사용 가능한 경우) find 대신 사용하는 것이 좋습니다 . 데이터베이스를 쿼리하면 결과가 즉각적으로 제공되며 시스템에 사실상 부하가 없습니다. 데이터베이스는 시스템이 실행되는 동안에만 업데이트되므로 updatedb
두 번째 정보를 원할 경우 먼저 실행해야 하며, 이는 시스템에 부하를 주지만 이는 시스템 검색 사용 계획에 따라 다릅니다.
필요에 맞는 정규식을 사용할 수 있습니다.
system1:/unix.stackexchange # locate *.tex *.pdf | grep unix.stack.*
/unix.stackexchange/access_me/1/file.pdf
/unix.stackexchange/access_me/1/file.tex