Para encontrar o número total de arquivos regulares no diretório $1
e em seus subdiretórios:
find "$1" -type f -printf "1\n" | wc -l
Para salvar esse número em uma variável:
var=$(find "$1" -type f -printf "1\n" | wc -l)
Isso funcionará mesmo que os nomes de arquivos ou diretórios contenham espaços em branco ou outros caracteres difíceis.
Discussão
Vamos considerar esta linha a partir do código original:
for x in `ls -lr $1 | grep "^d" | tr -s ' ' | cut -d ' ' -f 9`;
Primeiro, nunca se deve analisar ls . Não é confiável. A saída de ls
alterações de uma versão para a próxima. Além disso, devido à maneira como os caracteres especiais são tratados, o nome exibido ls
não é necessariamente o nome correto do arquivo ou diretório.
Em segundo lugar, ao usar variáveis shell $1
, eles devem estar entre aspas duplas. Caso contrário, a divisão de palavras e a expansão do nome de caminho são executadas nelas, o que pode levar a todos os tipos de erros.
Em terceiro lugar, em uma forma como:
for x in `...`
o shell executará a divisão de palavras e a expansão do nome de caminho no resultado da substituição do comando. Isso também pode levar a todos os erros.
return
ouunset
?