GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo usar Wc And Piping para encontrar cuántos archivos y directorios hay en un determinado directorio?

¿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 .. )).

Relacionado:¿Encontrar la mejor fuente para representar un punto de código?

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?

Linux
  1. Cómo encontrar el número de archivos en un directorio y subdirectorios

  2. Cómo encontrar y copiar cierto tipo de archivos de un directorio a otro en Linux

  3. ¿Usar Buscar para encontrar cierto directorio y eliminar todos los archivos excepto un directorio?

  4. Cómo enumerar recursivamente todos los archivos y directorios

  5. ¿Cómo busco directorios y encuentro archivos que coincidan con expresiones regulares?

Buscar comando en Linux (Buscar archivos y directorios)

Cómo cambiar el nombre de archivos y directorios en Linux

Cómo comprimir archivos y directorios en Linux

Cómo copiar archivos y directorios en Linux

Cómo usar sed para buscar y reemplazar cadenas en archivos

Cómo usar el comando cp para copiar archivos y directorios