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 -1
El manejo de los caracteres de nueva línea hace, en este caso, sensible a lals
salida 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 completostat
cuando 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?*.jpg
está 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/dir
es la cadena vacía o una ruta relativa que comienza con un guión. Pero me equivoqué antes de haber dicho quels
reemplaza los caracteres con?
. Eso sucede cuando stdout es una terminal, pero aquí la salida es una tubería, por lo quels
envía todos los caracteres de los nombres de archivo awc
. Eso hace que esta respuesta sea incorrecta sin el indicador-q
o-b
para 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
ls
salida.Prueba:
Compare con la respuesta aceptada :
U otras sugerencias:
fuente
-printf x
lugar de-exec printf x \;
. Es decir:find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c
no es necesario-exec
elprintf
comando externo , que si hay muchos archivos será muy lento , ya quefind
debe 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 .-printf
no es compatible con POSIXfind
, por lo que no lo utilicé.-mindepth
y-maxdepth
, que usaste.find
contiene-mindepth
y-maxdepth
no contiene,-printf
así que aprecio la inclusión de ambos.Este busca, ordena y enumera todos los archivos por extensión en orden:
fuente
| sort -rn
al final y tal vez un-mindepth 1
si solo dir actual.head -n
obtener 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
*.mp4
así que le sugiero que use la
-type f
opción comofind
parámetro de la siguiente manera.Además,
ls -lR
se 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 lawc
que contará el número de nuevas líneas usando la-l
bandera.fuente
*.mp4
el shell lo expande, nols
, esto fallará si hay tantos.mp4
archivos en el directorio que la lista de ellos no se puede pasarls
como 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í.-q
o-b
, esto no tolera nuevas líneas en los nombres de archivo. Si correls -1 *.mp4
desde su terminal sin tubería,ls
ve que su stdout es una terminal y toma-q
como está implícito, imprimiendo?
s. Pero ese comportamiento desaparece cuando se canaliza la salida.ls -1 *.mp4 | wc -l
cuenta en exceso si hay nuevas líneas.ls -1 *.mp4 | cat
muestra lo quewc
"ve". (Del mismo modo,-1
está implícito cuando stdout no es una terminal, por lo que es opcional).ls -1q -- *.mp4 | wc -l
Casi funciona, pero no con cero archivos .mp4.Esto debería darle la lista de archivos con .mp4
Cuando se combina con
wc -l
le dará cuentasi desea que la búsqueda incluya subdirectorios
fuente
wc -l
ls /directory/*.mp4
hace 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