Con el fin de probar, me gustaría contar cuántos archivos de imágenes hay dentro de un directorio, separando cada tipo de archivo de imagen por extensión de archivo (jpg = "yes". Esto porque más tarde será útil para otro script que ejecutará una acción en cada extensión de archivo). ¿Puedo usar algo como lo siguiente solo para archivos JPEG?
jpg=""
count=`ls -1 *.jpg 2>/dev/null | wc -l`
if [ $count != 0 ]
then
echo jpg files found: $count ; jpg="yes"
fi
Teniendo en cuenta las extensiones de archivo jpg, png, bmp, raw y otras, ¿debería usar un while
ciclo para hacer esto?
fuente
JPG
yjpg
archivos, y lo quería recursivamente, así que mi solución fue escribirfind . -type f | awk -F . '{print tolower($NF)}' | sort | uniq -c | awk '{print $2,":",$1}'
Esto atraviesa recursivamente archivos y cuenta extensiones que coinciden:
fuente
fuente
find
. Además, puede ayudar a los futuros lectores de estas respuestas si brinda una breve explicación de su solución (en caso de que deseen modificarla por un caso ligeramente diferente).find
Por defecto es el directorio actual, que es cómo uso esto. No creo que Dios pretendiera que los nombres de los archivos tuvieran espacios, pero esto funciona bien para ese caso. Si tienes nuevas líneas, entonces mereces todo lo que obtienes. Pensé en una explicación, pero decidí que la respuesta sería demasiado larga, creo que la simplicidad es lo que importa. 99% de los casos en 1% del tiempo. Esta es probablemente la versión 7 compatible.Tal vez puede acortarse
fuente
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 impliquewhile 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!).PS
-print0 | tr -d -c "\000" | wc -c
puede ser reemplazado con-printf "\000" | wc -c
o incluso-printf '\n' | wc -l
.fuente
puede usar ls para algo tan simple como OMI
o
o
fuente
Si está seguro de la extensión, se puede ir con
find
igualfuente
touch $'foo\nbar.jpeg
y se cuenta dos veces en lugar de una vez. O peor, alguien lo hacemkdir directory.jpeg; touch directory.jpeg/{1..100}.txt