Script Bash para contar o número de arquivos

11

Eu tenho um script e quero exibir mensagens diferentes se um arquivo existir ou não. Eu tenho um script como:

count=ls /import/*.zip | wc -l

echo "Number of files: " $count
if [ "$count" > "0" ]; then
    echo "Import $count files"
else
    echo "**** No files found ****"
fi

No entanto, se não houver arquivos, isso será exibido em No such file or directoryvez de 0. Há um diretório no /import/diretório, então não posso simplesmente executar um lscomando, pois ele sempre retornará um valor maior que 0.

Como posso contar o número de arquivos de uma extensão específica (.zip, .gz etc.) e usar esse valor em um script bash para exibir o número de arquivos e usá-lo em uma instrução if para exibir mensagens diferentes?

Wallace Sean
fonte

Respostas:

15

count=$(find /import -maxdepth 1 -name '*.zip' | wc -l)

Chris Ting
fonte
1
Eu adicionei -maxdepth 1 a contar apenas arquivos no diretório atual
Wallace Sean
1
Você provavelmente deseja citar '* .zip' caso haja arquivos .zip no diretório atual quando isso for chamado, caso em que o shell terá expandido o * .zip para você, enquanto você deseja que ele seja encontrado. (1)
Phil P
4

Tente com isto:

count=$(find /import/ -maxdepth 1 -type f -name '*.zip' | wc -l)
...
if [ $count -gt 0 ] ; then
  ...
else
  ...
fi

A idéia é ocultar o erro "sem esse arquivo" que é impresso no STDERR enviando-o para o bitbucket e usar a função de teste adequada para comparar números. ( -gtSignifica "maior que". Há também -eq, -lt, -ge, etc.)

Esteira
fonte
Como alternativa, você também pode fazercount=$(find /import -type f -name "*.zip" | wc -l)
slillibri
com certeza, mas isso tem um significado diferente ls /import/*.zipse houver subdiretórios #
187
Defino o maxdepth para evitar a contagem de arquivos nos subdiretórios e atualizei o script para usar -gt. Obrigado pela ajuda
Wallace Sean
Isso falhará se houver muitos arquivos no diretório para caber no argv para a chamada ls.
Phil P
Ah, certo. Corrigido com uma findvariante.
Mat
0

Eu tentei o seu script e, como esperado, quando há arquivos são combinados que não mostram 0 arquivos na saída, mas também mostra o lserro pouco antes. Resolver isso é bastante fácil, não há necessidade de desistir ls. Apenas substitua a primeira linha por esta:

count=$(ls /import/*.zip 2>/dev/null| wc -l)

2>/dev/nullredireciona o stderr para /dev/null, suprimindo a mensagem de erro.

Eduardo Ivanec
fonte