
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):
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"/*
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"
demasiados
cd
cd $1/$i counting $i # which in turn calls ... ls -a $1
ls
Dejando a un lado el análisis y las variables sin comillas, esto intentará enumerar el contenido del directorio./foo/bar/bar
cuando todo lo que tenga sea./foo/bar
.