contando recursivamente arquivos e diretórios

contando recursivamente arquivos e diretórios

Preciso de ajuda para isso:

Digamos que estou em um diretório e neste 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 no sub também.

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"

Responder1

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

  1. Nuncaanalisar a saída de ls.
    Seu script será interrompido 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 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 caracteres de espaço em branco (espaço, nova linha,…) para determinar onde um argumento de comando termina e outro começa. 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. Muitoscd

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

    lsDeixando de lado a análise e as variáveis ​​​​sem aspas, isso tentará listar o conteúdo do diretório ./foo/bar/barquando tudo o que você tiver for ./foo/bar.

informação relacionada