Para encontrar o número total de arquivos regulares no diretório $1
e 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 essa linha do código original:
for x in 'ls -lr $1 | grep "^d" | tr -s ' ' | cut -d ' ' -f 9';
Primeiro, deve-se nunca analisar ls . Não é confiável. A saída de ls
muda de uma versão para a próxima. Além disso, devido à maneira como os caracteres especiais são tratados, o nome exibido por ls
não é necessariamente o nome correto do arquivo ou diretório.
Em segundo lugar, ao usar variáveis shell, como $1
, elas 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, de 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.