Qualquer coisa envolvida ls
provavelmente produzirá resultados inesperados com caracteres especiais (espaço e outros símbolos). Qualquer basismo (como matrizes) não é portátil. Qualquer coisa envolvida while read
é geralmente lenta.
Por outro lado, find
é MUITO flexível (muitas opções para filtrar), possui [pelo menos] duas sintaxes que são à prova de falhas para caracteres especiais ... e Escala bem no diretório grande.
Neste exemplo, usei o -iname
nome da extensão em maiúsculas e minúsculas. Também restringi a -maxdepth 1
respeitar a sua pergunta "no diretório atual". Em vez de contar o número de linhas, onde os nomes de arquivos podem incluir CR / LF, -print0
imprimirá um byte NULL no final de cada nome de arquivo ... assim | tr -d -c "\000" | wc -l
como a contagem precisa de arquivos (NULL bytes!).
extensions="jpg png gif"
for ext in $extensions; do
c=$(find . -maxdepth 1 -iname "*.$ext" -print0 | tr -d -c "\000" | wc -c)
if [ $c -gt 0 ]; then
echo "Found $c *.$ext files"
find . -maxdepth 1 -iname "*.$ext" -print0 | xargs -0 -r -n1 DOSOMETHINGHERE
# or # find . -maxdepth 1 -iname "*.$ext" -exec "ls" "-l" "{}" ";"
fi
done
PS -print0 | tr -d -c "\000" | wc -c
pode ser substituído por -printf "\000" | wc -c
ou mesmo -printf '\n' | wc -l
.