Cualquier cosa que involucre ls es probable que produzca resultados inesperados con caracteres especiales (espacio y otros símbolos). Cualquier bashismo (como las matrices) no es portátil. Cualquier cosa que implique while reades generalmente lenta.
Por otra parte, find es MUY flexible (muchas opciones para filtrar), tiene [al menos] dos sintaxis que son a prueba de fallas para caracteres especiales ... y se escala bien en directorios grandes.
Para este ejemplo, solía -inamecoincidir con el nombre de la extensión en mayúsculas y minúsculas. También he restringido el -maxdepth 1para respetar su pregunta "en el directorio actual". En lugar de contar el número de líneas, donde los nombres de archivo podrían incluir CR / LF, -print0se imprimirá un byte NULL al final de cada nombre de archivo ... así que | tr -d -c "\000" | wc -lse cuentan los archivos con precisión (¡bytes NULL!).
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 -cpuede ser reemplazado con -printf "\000" | wc -co incluso -printf '\n' | wc -l.