¿Cómo puedo usar el contador de palabras (wc
) y tuberías para contar cuántos archivos o directorios hay en el /usr/bin
directorio?
Respuesta aceptada:
Un enfoque sería hacer uso de ls
para darnos una lista de los archivos, pero queremos que esta lista esté garantizada para mostrar solo 1 archivo o directorio por línea. El -1
switch hará esto por nosotros.
$ ls -1
dir1
dir2
dir3
fileA
fileB
fileC
Ejemplo
Cree los datos de muestra anteriores en un directorio vacío.
$ mkdir dir{1..3}
$ touch file{A..C}
Compruébalo:
$ ls
dir1 dir2 dir3 fileA fileB fileC
Ahora para contar puedes usar wc -l
para contar el número de líneas, que corresponden a un archivo o directorio en el ls -1
salida.
$ ls -1 | wc -l
6
(tenga en cuenta, sin embargo, que no incluye los archivos ocultos)
Contar archivos o directorios, pero no juntos
Para contar archivos o directorios, debe cambiar ligeramente su táctica. En este caso usaría ls -l
ya que muestra qué es un directorio y qué es un archivo.
Ejemplo
$ ls -l
total 12
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir1
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir2
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir3
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileA
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileB
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileC
Entonces podemos usar grep
para filtrar directorios o no directorios así:
# directories
$ ls -l | grep "^d"
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir1
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir2
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir3
# regular files
$ ls -l | grep "^-"
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileA
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileB
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileC
Ahora solo usa wc -l
de nuevo para contar lo anterior:
# directories
$ ls -l | grep "^d" | wc -l
3
# regular files
$ ls -l | grep "^-" | wc -l
3
Sin embargo, puedes evitar wc
en conjunto, y use grep
‘s -c
opción:
$ ls -l | grep -c '^d'
(Nuevamente, los archivos ocultos no están incluidos. Tenga en cuenta que los directorios y los regulares son dos tipos de archivos. Hay muchos más, como canalizaciones con nombre, enlaces simbólicos, dispositivos, sockets...).
Recursión
Si necesita encontrar los archivos y directorios de forma recursiva en /usr/bin
entonces es probable que desee cambiar las tácticas por completo y utilizar otra herramienta llamada find
.
Ejemplo
$ find /usr/bin | wc -l
4632
(aunque por encima de /usr/bin
sí mismo está incluido en el conteo)
Las mismas técnicas que usé anteriormente podrían emplearse use ls
hacer algo similar pero ls
generalmente no es una buena herramienta para analizar la salida. find
por otro lado, fue creado para esto y ofrece interruptores para encontrar archivos o directorios.
# find files
$ find /usr/bin -type f
# find directories
$ find /usr/bin -type d
(Tenga en cuenta que esta vez, find
incluye archivos ocultos (excepto .
y ..
)).
nuevas líneas?
Nunca he descubierto por qué un carácter de nueva línea es un carácter legal para usar al crear nombres de archivos o nombres de directorios. Entonces, los métodos discutidos anteriormente usando wc
y ls
no competiría con estos, así que úselos con eso en mente.
Ejemplo
Cree un directorio y un nombre de archivo con líneas nuevas.
$ mkdir $'dir4n5'
$ touch $'fileDnE'
ls
los muestra correctamente:
$ ls -1
dir1
dir2
dir3
dir4?5
fileA
fileB
fileC
fileD?E
Pero wc
cuenta los directorios y archivos que contienen líneas nuevas como 2 elementos, no uno.
$ ls -1 | wc -l
10
Un método para evitar esto, si usa la implementación GNU de find
es hacer uso de find
la capacidad de imprimir algo más en lugar de cada archivo que encuentra y luego contarlos en su lugar.
Ejemplo
$ find . -printf . | wc -c
9
Aquí estamos encontrando todo en el directorio actual (excepto ..
) e imprimiendo un punto (.
) para cada uno, y luego contando los puntos usando wc
la capacidad de contar bytes en lugar de líneas, wc -c
.
Referencias
- bash:¿cuál es la mejor manera de contar los resultados de búsqueda?