Estoy usando cygwin en windows.
Deseo contar la cantidad de archivos jpeg, gif y png de una carpeta raíz.
Ahora puedo hacer:
ls . -1R | grep '.jpeg' | wc -l
ls . -1R | grep '.gif' | wc -l
ls . -1R | grep '.png' | wc -l
¿Pero pensé que si había una group bysintaxis de tipo aquí podría hacer esto con un comando en lugar de tres?
¿Algun consejo?

.en el nombre del archivo y que no hay espacios. Si realmente quieres usar gawk, imprime$NF, no$2.$NFera lo que estaba buscando-nes interpretar números como números, y no como cadenas. de lo contrario, a12se considera inferior a a2.También puedes usar
find:Esto devuelve el número de archivos bajo
.con extensionesjpeg,gifypngmuy bien formateado con un resultado por línea:Agregue otras extensiones según sea necesario.
Explicación del comando:
find . -name \*.jpeg -o -name \*.gif -o -name \*.pngbusca archivos que coincidan con ' .jpeg' o ' .gif' o '* .png'.
sed 's/.*\.\([^.]\+\)/\1/'elimina el nombre de archivo y solo deja la extensión, por ejemplo, se
file.gifconviertegifsortordenar extensiones. Después de este comando, la salida se ve así:
uniq -cinformar el número de ocurrencias.
fuente
Estas soluciones funcionan para bash. No estoy seguro si desea el número de cada tipo de archivo o el total.
Si desea el número total de archivos de imagen, intente esto:
Esto significa
lscualquier cosa que termine enjpg,pngogify que atraviesewc.Si quieres el número de cada uno, haz:
Este es un ciclo for. Se ejecutará 3 veces, una para cada uno de jpg png y gif. Cada vez que se ejecuta el bucle, la
$nvariable tomará una de las extensiones como valor. Entonces, para la primera ejecución,ls *$nse ampliará als *jpg.echoesencialmente solo significa "imprimir".echo -nesignifica imprimir sin una nueva línea (-n) y permitir caracteres de escape-e, esto me permite usar el carácter de tabulación\t.Esto funcionará bien siempre que tenga al menos un archivo de cada tipo, de lo contrario se quejará (seguirá funcionando, solo se quejará). Para una versión un poco más robusta, intente esto:
Este bucle es similar al anterior pero comprueba si el
lscomando devuelve un error. El||operando en bash significa "Haz esto o, si esto no funcionó, haz eso ". Por lo tanto, le digo a bash,ls *jpgetc., y si no funciona, es decir, si no hay archivos con esa extensión, echo (print)0. Esto2>/dev/nullhace que se descarten los mensajes de error.También puede usar awk (esta es una ligera modificación de la respuesta de mauro stettler, por lo que contará solo los archivos con las extensiones que le interesan):
fuente
2>significa redirigir mensajes de error,/dev/nulles un dispositivo especial en * nix utilizado para descartar cosas. Es solo un truco que descarta los mensajes de error.