
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):
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"/*
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"
Muitos
cd
cd $1/$i counting $i # which in turn calls ... ls -a $1
ls
Deixando de lado a análise e as variáveis sem aspas, isso tentará listar o conteúdo do diretório./foo/bar/bar
quando tudo o que você tiver for./foo/bar
.