contando arquivos e diretórios recursivamente

0

Eu preciso de ajuda para isso:

Digamos que eu esteja em um diretório e nesse diretório existem outros diretórios e arquivos, etc ...

Eu gostaria de usar uma função recursiva para contar todos os arquivos e diretórios nela e também no sub.

Eu sei que posso resolver o problema usando wc ... grep ou find, mas estou realmente tentando usar minha primeira função recursiva aqui.

Isso é o que eu fiz até agora, mas não funciona corretamente

    counting(){


    for i in $(ls -a $1)
    do
          if [ -d $1/$i ];then
          let d++
          cd $1/$i       
          counting $i
          cd ..
          elif [ -f $1/$i ];then
          let f++
          fi
    done

  }

counting $1
echo "number of files = $f ; number of directories = $d"
    
por Nico045 24.10.2016 / 18:43

1 resposta

1

Aqui estão algumas coisas que você pode melhorar (sem qualquer reivindicação de integridade):

  1. Nunca analise a saída de ls .
    Seu script será quebrado assim que qualquer nome de arquivo ou diretório contiver espaços em branco (o que é perfeitamente legítimo na maioria dos sistemas de arquivos modernos). Em vez disso, use o recurso de globbing do seu shell:

    shopt -s dotglob # to make the * glob match hidden files (like ls -a)
    for i in "$1"/*
    
  2. Sempre cite variáveis.
    Seu shell analisa os caracteres do espaço em branco (espaço, nova linha,…) para determinar onde um argumento de comando termina e outro inicia. Considere o seguinte exemplo:

    filename="foo bar"
    
    touch $filename
    # gets expanded to 'touch foo bar', so it creates two files named "foo" and "bar"
    
    touch "$filename"
    # gets expanded to 'touch "foo bar'", so it creates a single file named "foo bar"
    
  3. Um cd demais

    cd $1/$i       
    counting $i
    
    # which in turn calls ...
    ls -a $1
    

    ls -parando e excluindo variáveis não mencionadas, isso tentará listar o conteúdo do diretório ./foo/bar/bar quando tudo que você tiver for ./foo/bar .

por 24.10.2016 / 19:40