Como faço para contar o número de arquivos em todos os subdiretórios e adicionar as contagens juntos

0

Eu estou tentando contar o número de arquivos em cada diretório / subdiretório, juntá-los e obter um total que eu possa comparar com outro diretório:

#!/bin/bash

echo "Checking directories for proper extensions"

for LOOP in 1 2 3 4; 
do
    if [[ $LOOP -eq 1 ]]; then
        find ./content/documents -type f ! \( -name \*.txt -o -name \*.doc -o -name \*.docx \)
        count1=$(find ./content/documenets -type f) | wc -l
        #count number of files in directory and add to counter
    elif [[ $LOOP -eq 2 ]]; then
        find ./content/media -type f ! -name \*.gif 
        count2=$(find ./content/media -type f) | wc -l
        #count number of files in directory and add to counter
    elif [[ $LOOP -eq 3 ]]; then
        find ./content/pictures -type f ! \( -name \*.jpg -o -name \*.jpeg \) 
        count3=$(find ./content/pictures -type f) | wc -l
        #count number of files in directory and add to counter
    else
        count4=$(find /home/dlett/content/other -type f) | wc -l
        #count number of files in directory and add to counter
    fi

    #list the files in each subdirectory in catalog and put into an array
    #count the number of items in the array
    #compare number of item in each array
    #if the number of item in each array doesn't equal 
        #then print and error message
    content_Count=$(( count1+count2+count3+count4 ))
    echo $content_Count
done
    
por lettda 17.04.2016 / 03:08

1 resposta

1

Sua pergunta não diz de onde vêm os valores anteriores conhecidos. Eu suponho que você tenha uma árvore paralela para a árvore content chamada ../oldcontent . Ajuste para se adequar:

#!/bin/bash

echo "Checking directories for proper extensions"

for d in documents media pictures other
do
    nfc=$(find content/$d -type f | wc -l)
    ofc=$(find ../oldcontent/$d -type f | wc -l)
    if [ $nfc -eq $ofc ]
    then
         echo The "$d" directory has as many files as before.
    elif [ $nfc -lt $ofc ]
    then
         echo There are fewer files in the content directory than before.
    else
         echo There are more files in the content directory than before.
    fi
done

Este código é muito mais curto porque não tenta dar um comando find diferente em cada loop. Se você realmente precisar disso, use uma matriz associativa para associar nomes de diretório e find argumentos:

declare -A dirs=(
    [documents]="-name \*.txt -o -name \*.doc -o -name \*.docx" 
    [media]="-name \*.gif"
    [pictures]="-name \*.jpg -o -name \*.jpeg"
    [other]=""
)

Em seguida, o loop for se torna:

for d in "${!dirs[@]}"
do
    nfc=$(find content/$d -type f ${dirs[$d]} | wc -l)
    ofc=$(find ../oldcontent/$d -type f ${dirs[$d]} | wc -l)

...

Isso só funciona no Bash 4 e acima, no entanto. Existe um mecanismo de matriz associativa menos potente no Bash 3, mas está muito quebrado por design. Se você não tem o Bash 4 em mãos, eu o encorajo a mudar para algo como Perl, Python ou Ruby ao invés de tentar armar as matrizes associativas do Bash 3 para o serviço por algo como isto.

Tenha em atenção que isto não lhe diz que a árvore content contém os mesmos ficheiros que ../oldcontent , apenas que cada subdirectório tem o mesmo número de ficheiros. Se você estiver tentando detectar alterações nos arquivos de cada árvore, será necessário usar rsync ou minha solução " MD5 um diretório " aqui no Unix.SE.

    
por 17.04.2016 / 03:40