
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 -l
directamente en los archivos que coinciden 2009*
, contando el número de líneas en cada uno. Mientras tanto, ls -1
está intentando escribir en la entrada estándar de wc
, que wc
no 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 ls
con -d
para no enumerar el contenido de los directorios) y contaría el número de líneas en la salida. Tenga en cuenta que -1
no es necesario si canaliza el resultado desde ls
algún lugar (a menos que ls
sea 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 set
y generar $#
además no utiliza ningún comando externo en la mayoría de los shells)
Usando find
para 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 find
podemos 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 zsh
shell puede usarlo *(.)
para modificar el comportamiento del patrón para que solo coincida con archivos normales (el zsh
usuario probablemente lo usaría 2009*(.)
en lugar de 2009*
en las find
variaciones anteriores y posteriores).
Usando **
in (con shopt -s globstar
in bash
, o set -o extended-glob
in 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