contar el número de archivos en el directorio con un nombre determinado

contar el número de archivos en el directorio con un nombre determinado

Encontré este código aquíhttps://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.htmllo que muy bien me da la cantidad de archivos en mi directorio.

ls -1 | wc -l

pero sólo quiero saber cuántos de esos archivos comienzan con 2009 (por ejemplo 20091210_005037.nc).

Lo intenté ls -1 | wc -l 2009*pero lentamente enumera todos los archivos y no parece darme un número.

Respuesta1

set -- 2009*
echo "$#"

Esto establece la lista de parámetros posicionales ( $1,, $2..., etc.) para los nombres que coinciden 2009*. La longitud de esta lista es $#.


El problema ls -1 | wc -l 2009*es que ejecuta wc -ldirectamente en los archivos que coinciden 2009*, contando el número de líneas en cada uno. Mientras tanto, ls -1está intentando escribir en la entrada estándar de wc, que wcno lee porque recibió una lista explícita de archivos en los que trabajar.

Es posible que haya querido utilizar ls -d 2009* | wc -l. Esto habría enumerado todos los nombres que coinciden 2009*(usando lscon -dpara no enumerar el contenido de los directorios) y contaría el número de líneas en la salida. Tenga en cuenta que -1no es necesario si canaliza el resultado desde lsalgún lugar (a menos que lssea un alias o una función de shell que fuerce la salida de la columna).

Tenga en cuenta también que esto le daría laequivocadocuente si algún nombre de archivo contiene una nueva línea:

$ touch '2009
> was
> a
> good
> year'
$ ls
2009?was?a?good?year
$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 May 28 11:09 2009?was?a?good?year
$ ls -1
2009?was?a?good?year
$ ls | wc -l
       5
$ ls -1 | wc -l
       5

Sin embargo:

$ set -- 2009*
$ echo "$#"
1

(Usar sety generar $#además no utiliza ningún comando externo en la mayoría de los shells)


Usando findpara contar recursivamente:

find . -type f -name '2009*' -exec echo . \; | wc -l

Aquí, generamos un punto para cada nombre de ruta encontrado en o debajo del directorio actual, y luego contamos el número de líneas que esto produce. No contamos las cadenas de nombres de archivos en sí, sino que lo hacemos de esta manera para evitar contar demasiadas líneas si un nombre de archivo contiene nuevas líneas.

Con esto findpodemos controlar más de cerca eltipode archivo que contamos. Arriba, probamos explícitamentearchivos regularescon -type f(es decir, no directorios y otros tipos de archivos). El *patrón en el shell no distingue entre directorios y archivos, pero el zshshell puede usarlo *(.)para modificar el comportamiento del patrón para que solo coincida con archivos normales (el zshusuario probablemente lo usaría 2009*(.)en lugar de 2009*en las findvariaciones anteriores y posteriores).

Usando **in (con shopt -s globstarin bash, o set -o extended-globin yash, o en cualquier otro shell que lo admita), para contar de forma recursiva:

set -- **/2009*
echo "$#"

El patrón **coincide casi como *, pero también coincide /en los nombres de ruta.

Respuesta2

Probé con el siguiente comando y funcionó bien y obtuve el resultado.

   find . -maxdepth 1 -type f -iname "2009*" | awk '{print NR}'| sed -n '$p'

Nota: Si desea acceder al subdirectorio, también elimine la opción max Depth

Respuesta3

Gracias a la gente en los comentarios, esta es la respuesta a mi pregunta:

ls 2009* | wc -l

o usando buscar

find 2009* | wc -l

Respuesta4

Para contar la cantidad de archivos que comienzan con un nombre de archivo particular usando awk.

root@ubuntu$ find . -name "2009*" | awk 'BEGIN{total=0}; {total=total+1} END {print "total files starting with 2009 is " ,total}'
total files starting with 2009 is  4

información relacionada