Eu estou tentando contar o número de arquivos dentro de um diretório enquanto verifica os subdiretórios com o mesmo script e soma os resultados.
#!/bin/bash
var=0
var=$(ls -l $1 | grep "^-" | tr -s ' ' | cut -d ' ' -f 9 | wc -l)
for x in `ls -lr $1 | grep "^d" | tr -s ' ' | cut -d ' ' -f 9`;
do
output="$($0 $x)"
var=$((var+output))
done
echo $var
No entanto, não estou obtendo o resultado correto.
O que estou fazendo de errado?
linux
bash
bash-scripting
user1326293
fonte
fonte
return
ouunset
?Respostas:
Para encontrar o número total de arquivos regulares no diretório
$1
e em seus subdiretórios:Para salvar esse número em uma variável:
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:
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 exibidols
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:
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.
fonte
Aqui está uma adaptação do seu script que funciona (para mim) e usa mecanismos mais seguros:
Isso é diferente do seu, em que o meu contará todas as entradas de diretório, além dos diretórios, enquanto o seu não contará itens que não sejam arquivos simples (por exemplo, links simbólicos, nós de dispositivos, pipes nomeados, soquetes do sistema de arquivos etc.)
(O
shopt -s nullglob
está lá para lidar com diretórios que não têm conteúdo).fonte