하위 디렉터리의 패턴과 일치하는 파일 수를 계산하는 스크립트

하위 디렉터리의 패턴과 일치하는 파일 수를 계산하는 스크립트

현재 디렉터리(하위 디렉터리 및 숨김 파일 포함)에 있는 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

관련 정보