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 read
es 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 -iname
coincidir con el nombre de la extensión en mayúsculas y minúsculas. También he restringido el -maxdepth 1
para 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, -print0
se imprimirá un byte NULL al final de cada nombre de archivo ... así que | tr -d -c "\000" | wc -l
se 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 -c
puede ser reemplazado con -printf "\000" | wc -c
o incluso -printf '\n' | wc -l
.