Obtendo contagem de arquivos durante a iteração através de diretórios e pastas

3
recursiveprint() {
#FILES_COUNT=0

cd $1
  for d in *; do
    if [ -d "$d" ]; then
       (recursiveprint "$d")
    fi
    if [ -f "$d" ]; then
       file_name=$(basename "$d")
        ((FILES_COUNT++))
        clear
        echo  "$file_name"
        echo "total count = $FILES_COUNT"
    fi
    done
}
recursiveprint ${START_DIR}

O problema é que, depois de passar por uma pasta, ela retorna a contagem para zero antes de percorrer outra pasta. Ao todo, tenho 30 arquivos em pastas diferentes, a contagem acaba sendo 6, ou seja, o número de arquivos na última pasta que ele percorre. Alguma dica de como resolver isso?

    
por Raphael 15.05.2017 / 12:58

3 respostas

5

if [ -d "$d" ]; then
   (recursiveprint "$d")
fi

Os parênteses em torno da linha (recursiveprint "$d") executam a função em uma sub-rede. Quando o subshell é iniciado, o valor de FILES_COUNT é clonado e as alterações feitas na chamada recursiva dentro do subshell não entram em vigor no ambiente circundante.

Sem um subshell, ele deve funcionar melhor, mas você precisa voltar manualmente ao diretório pai ao retornar de uma instância da função. cd .. faria as chamadas feitas dentro da função, mas vamos usar uma variável para podermos voltar ao diretório de trabalho original, mesmo que seja dado como um caminho absoluto.

recursiveprint() {
    local oldpwd=$PWD
    cd "$1"
    ...
        if [ -d "$d" ]; then
           recursiveprint "$d"          # no parenthesis here
        fi
    ...
    cd "$oldpwd"
}

Observe também que * não corresponde a nomes de arquivos começando com um ponto por padrão, use shopt -s dotglob , se você quiser.

    
por 15.05.2017 / 13:53
3

não vai

find /my/dir/ -type f | grep -c .

trabalhe para você?

    
por 15.05.2017 / 13:59
2
find .// -type f | grep -c '^\.//'

contará todos os arquivos de forma confiável (mesmo aqueles que incluem novas linhas em seus nomes).

    
por 15.05.2017 / 14:50

Tags