Quiero contar el número total de archivos en un directorio particular que termina con la extensión ".mp4".
Recibo el siguiente comando:
ls -F |grep -v / | wc -l
Cuenta todos los archivos en un directorio particular, pero quiero contar los archivos que terminan con la extensión .mp4.
¿Hay algún comando de Ubuntu para eso?
command-line
ls
Prakash V Holkar
fuente
fuente

ls -1El manejo de los caracteres de nueva línea hace, en este caso, sensible a lalssalida de análisis . El marcado es incorrecto para el uso de la bandera -R.Respuestas:
Aquí puedes hacerlo de esta manera
Esto te da cuenta
fuente
-R? ¿Por qué hacer un completostatcuando solo necesitas el nombre de archivo? ¿Por qué nols -1 *.jpg| wc -l? (ok, no funciona si tienes nombres de archivo con nuevas líneas. En ese caso te lo mereces ;-) ...).jpg. ¿Alguna vez lo has probado?*.jpgestá expandido por el shell, no porls) y si hay archivos cuyos nombres comienzan con guiones... Pero en realidad funciona bien con guiones en los nombres, excepto cuando/path/to/dires la cadena vacía o una ruta relativa que comienza con un guión. Pero me equivoqué antes de haber dicho quelsreemplaza los caracteres con?. Eso sucede cuando stdout es una terminal, pero aquí la salida es una tubería, por lo quelsenvía todos los caracteres de los nombres de archivo awc. Eso hace que esta respuesta sea incorrecta sin el indicador-qo-bpara cambiar ese comportamiento , porque los nombres de archivo pueden contener nuevas líneas. La respuesta de l0b0 está libre de estos problemas.Desafortunadamente, este problema benigno es difícil de resolver de una manera que admita todos los nombres de archivo y sea portátil. Esto es seguro (maneja archivos ocultos, rutas que contienen espacios, guiones e incluso líneas nuevas)
y POSIX compatible:Si no desea que sea recursivo, simplemente agregue
-maxdepth 1.No debe analizar la
lssalida.Prueba:
Compare con la respuesta aceptada :
U otras sugerencias:
fuente
-printf xlugar de-exec printf x \;. Es decir:find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -cno es necesario-execelprintfcomando externo , que si hay muchos archivos será muy lento , ya quefinddebe bifurcar (2) una copia de sí mismo y luego ejecutar (2)/usr/bin/printf. Con-exec printf x \;eso, debe hacerse una vez para cada archivo .-printfno es compatible con POSIXfind, por lo que no lo utilicé.-mindepthy-maxdepth, que usaste.findcontiene-mindepthy-maxdepthno contiene,-printfasí que aprecio la inclusión de ambos.Este busca, ordena y enumera todos los archivos por extensión en orden:
fuente
| sort -rnal final y tal vez un-mindepth 1si solo dir actual.head -nobtener la n superior.Creo que es muy simple como seguir los comandos.
o
Creo que los comandos anteriores calculan el recuento de archivos y nombres de directorios
*.mp4así que le sugiero que use la
-type fopción comofindparámetro de la siguiente manera.Además,
ls -lRse puede usar comofind .fuente
Podrías usar
ls -1 *.mp4 | wc -l.Esto mostrará una lista de todos los archivos que terminan en
.mp4, imprimiendo cada archivo en una nueva línea (ls -1 *.mp4), canalizando la salida a lawcque contará el número de nuevas líneas usando la-lbandera.fuente
*.mp4el shell lo expande, nols, esto fallará si hay tantos.mp4archivos en el directorio que la lista de ellos no se puede pasarlscomo argumentos.--.mp4--resolverá el segundo caso; el primero generará un mensaje de error (¡necesita muchos archivos!) y otra buena pregunta aquí. Casos de esquina, pero vale la pena notar, sí.-qo-b, esto no tolera nuevas líneas en los nombres de archivo. Si correls -1 *.mp4desde su terminal sin tubería,lsve que su stdout es una terminal y toma-qcomo está implícito, imprimiendo?s. Pero ese comportamiento desaparece cuando se canaliza la salida.ls -1 *.mp4 | wc -lcuenta en exceso si hay nuevas líneas.ls -1 *.mp4 | catmuestra lo quewc"ve". (Del mismo modo,-1está implícito cuando stdout no es una terminal, por lo que es opcional).ls -1q -- *.mp4 | wc -lCasi funciona, pero no con cero archivos .mp4.Esto debería darle la lista de archivos con .mp4
Cuando se combina con
wc -lle dará cuentasi desea que la búsqueda incluya subdirectorios
fuente
wc -lls /directory/*.mp4hace que el shell expanda el globo y ejecute algo comols /directory/file1.mp4 /directory/file2.mp4 ...Esto fallará si el directorio contiene más archivos mp4 de los que se pueden pasar como argumentosls.En bash, un recurso frío para usar matrices con glob:
fuente
Reemplazar (.csv con la extensión que desee)
Explicación: Creo que un esquema simple es buscar la lista de archivos y contar la extensión con grep.
\.hacer coincidir.y$hacer coincidir la extensión al final de la línea. Funciona porque cuando la salida de ls se canaliza, se envía un nombre de archivo por línea, que puede verificar ejecutando:fuente
grep --count, también podría usargrep -c.¿ Verifica cómo contar los archivos por extensión en Linux? , da una buena respuesta y explicación, puede usar el siguiente comando:
fuente