Script para contar arquivos que correspondem a um padrão em subdiretórios

1

Eu escrevi o seguinte script para encontrar o número de arquivos pdf e tex a partir do diretório atual, incluindo os subdiretórios e arquivos ocultos. O código a seguir é capaz de encontrar o número de arquivos pdf até 2 níveis de subdiretórios abaixo, mas depois disso ele diz que não há subdiretórios ...

#!/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
    
por user13522 22.12.2011 / 06:40

3 respostas

8

A resposta dada pelo kev irá quebrar em arquivos com novas linhas no nome. Você pode fazer isso em bash :

shopt -s nullglob dotglob globstar
set -- **/*.pdf **/*.tex
echo "$#"
    
por 22.12.2011 / 09:38
6

find funciona bem para mim:

$ 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

Editar:
Para lidar com casos especiais: newline in filename

$ find . \( -name '*.pdf' -o -name '*.tex' \) -printf x | wc -c
    
por 22.12.2011 / 07:09
0

Eu recomendaria (se disponível) usando locate em vez de localizar. Você estaria consultando um banco de dados e os resultados seriam instantâneos e praticamente não há carga no sistema. Embora o banco de dados seja atualizado apenas quando o sistema executa updatedb , portanto, se você quisesse até a segunda informação, teria que executá-lo primeiro e colocaria uma carga no sistema, mas isso depende de como você pretende para usar sua pesquisa.

Você pode usar qualquer regex que atenda às suas necessidades.

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