contando recursivamente archivos y directorios

contando recursivamente archivos y directorios

Necesito ayuda para esto:

Digamos que estoy en un directorio y en este directorio hay otros directorios y archivos, etc...

Me gustaría usar una función recursiva para contar todos los archivos y directorios que contiene y también en el sub.

Sé que puedo resolver el problema usando wc... grep o find pero realmente estoy tratando de usar mi primera función recursiva aquí.

Esto es lo que he hecho hasta ahora pero no funciona correctamente.

    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"

Respuesta1

Aquí hay algunas cosas que puede mejorar (sin pretender que estén completas):

  1. Nuncaanalizar la salida de ls.
    Su secuencia de comandos se interrumpirá tan pronto como cualquier nombre de archivo o directorio contenga espacios en blanco (lo cual es perfectamente legítimo en la mayoría de los sistemas de archivos modernos).
    En su lugar, utilice la función global de su shell:

    shopt -s dotglob # to make the * glob match hidden files (like ls -a)
    for i in "$1"/*
    
  2. Cita siempre variables.
    Su shell analiza los espacios en blanco (espacio, nueva línea,…) para determinar dónde termina un argumento de comando y comienza otro. Considere el siguiente ejemplo:

    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. demasiadoscd

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

    lsDejando a un lado el análisis y las variables sin comillas, esto intentará enumerar el contenido del directorio ./foo/bar/barcuando todo lo que tenga sea ./foo/bar.

información relacionada