サブディレクトリのパターンに一致するファイル数を数えるスクリプト

サブディレクトリのパターンに一致するファイル数を数えるスクリプト

現在のディレクトリ(サブディレクトリと隠しファイルを含む)にある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の代わりに使用することをお勧めします。データベースを照会すると、結果がすぐに提供され、システムに事実上負荷がありません。データベースはシステムの実行中にのみ更新されるため、2番目の情報が必要なupdatedb場合は最初に実行する必要があります。これはシステムに負荷をかけますが、これはシステム検索の使用計画によって異なります。

必要に応じて正規表現を使用できます。

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

関連情報