it-swarm-es.tech

¿Cómo puedo obtener un recuento de archivos en un directorio usando la línea de comando?

Tengo un directorio con una gran cantidad de archivos. No veo un interruptor ls para proporcionar el recuento. ¿Hay alguna línea de comando mágica para obtener un recuento de archivos?

219
Blake

Usando una definición amplia de "archivo"

ls | wc -l

(tenga en cuenta que no cuenta los archivos ocultos y supone que los nombres de los archivos no contienen caracteres de nueva línea).

Para incluir archivos ocultos (excepto . y ..) y evitar problemas con los caracteres de nueva línea, la forma canónica es:

find . ! -name . -Prune -print | grep -c /

O recursivamente:

find .//. ! -name . -print | grep -c //
279
James Roth

Para una definición estrecha de archivo:

 find . -maxdepth 1 -type f | wc -l
35
Maciej Piechotka
ls -1 | wc -l

...

$ ls --help | grep -- '  -1'
    -1                         list one file per line

...

$ wc --help | grep -- '  -l'
    -l, --lines            print the newline counts

PD: Nota ls - <número-> | wc - <letter-l>

15
nicomen

He encontrado du --inodes útil, pero no estoy seguro de qué versión de du requiere. Debería ser sustancialmente más rápido que los enfoques alternativos que usan find y wc.

En Ubuntu 17.10, funciona lo siguiente:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

Combinar con | sort -nr para ordenar descendentes por número de inodos que contienen.

12
krlmlr

Probablemente la respuesta más completa usando el par ls/wc es

ls -Aq | wc -l

si desea contar archivos de puntos y

ls -q | wc -l

de otra manera.

  • -A Es para contar archivos de puntos, pero omita . Y ...
  • -q Hace que ls reemplace los caracteres no gráficos, específicamente el carácter de nueva línea, con ?, Haciendo que la salida sea 1 línea para cada archivo

Para obtener una salida de una línea de ls en el terminal (es decir, sin conectarlo a wc), se debe agregar la opción -1.

(comportamiento de ls probado con coreutils 8.23)

12
Frax

Si sabe que el directorio actual contiene al menos un archivo no oculto:

set -- *; echo "$#"

Esto es obviamente generalizable a cualquier glob.

En un guión, esto tiene el efecto secundario a veces desafortunado de sobrescribir los parámetros posicionales. Puede solucionarlo utilizando una subshell o con una función (versión Bourne/POSIX) como:

count_words () {
  eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"

Una solución alternativa es $(ls -d -- * | wc -l). Si el glob es *, El comando se puede acortar a $(ls | wc -l). Analizar la salida de ls siempre me inquieta, pero aquí debería funcionar siempre y cuando los nombres de sus archivos no contengan nuevas líneas, o su ls se les escape. Y $(ls -d -- * 2>/dev/null | wc -l) tiene la ventaja de manejar el caso de un globo no coincidente con gracia (es decir, devuelve 0 en ese caso, mientras que el método set * Requiere pruebas complejas si el globo puede estar vacío ).

Si los nombres de archivo pueden contener caracteres de nueva línea, una alternativa es usar $(ls -d ./* | grep -c /).

Cualquiera de esas soluciones que dependen de pasar la expansión de un globo a ls puede fallar con un error lista de argumentos demasiado larga si hay muchos archivos coincidentes.

Si usamos el par ls/wc si estamos agregando -U, será mucho más rápido (no ordenar).

ls -AqU | wc -l
5
Jbnair

Después de instalar el comando del árbol, simplemente escriba:

tree

Si también quieres archivos ocultos:

tree -a

Si está utilizando Debian/Mint/Ubuntu Linux, escriba el siguiente comando para instalar el comando del árbol:

Sudo apt-get install tree

La opción -L se usa para especificar el nivel máximo de visualización del árbol de directorios. El comando de árbol no solo cuenta la cantidad de archivos, sino también la cantidad de directorios, considerando tantos niveles del árbol de directorios como desee.

4
lev
find -maxdepth 1 -type f -printf . | wc -c
  • -maxdepth 1 lo hará no recursivo, find es recursivo por defecto
  • -type f incluirá solo archivos
  • -printf . es un lindo toque. imprime un punto para cada archivo en lugar del nombre de archivo, y ahora puede manejar cualquier nombre de archivo y también guarda datos; solo tenemos que contar los puntos :)
  • | wc -c cuenta caracteres
3
aude

Sin tubería, sin copia de cadena, sin tenedor, simplemente golpea un forro

$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
1
DaboD

En Linux, para hacer que el comando sea muy robusto y manejar archivos que pueden tener nuevas líneas en su nombre, use esto:

find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c

Esto nos salva de la salida prueba del análisis ls.


Relacionado:

1
codeforester

Aquí hay otra técnica similar a la na que Gilles publicó :

Word_count () { local c=("[email protected]"); echo "${#c[@]}"; }
file_count=$(Word_count *)

que crea una matriz con 13,923 elementos (si esa es la cantidad de archivos que hay).

find . -type f -maxdepth 1 |  wc -l 

Esto puede enumerar solo los archivos en el directorio actual.

1
srpatch

Mejorando algunas respuestas dadas antes pero esta vez haciéndolo explícitamente.

$ tree -L 1 | tail -n 1 | cut -d " " -f 3

Vale la pena notar el uso de algunos comandos amados como tail y cut. Además, tenga en cuenta que el árbol no está disponible de forma predeterminada. El comando anterior captura primero información sobre el directorio en el nivel 1, luego obtiene la última línea tail -n 1 donde está nuestro objetivo, y termina con cut para tomar la tercera palabra.

Por ejemplo, ubicando en /:

/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1

Entonces, ¿qué hay de preguntar el número de directorios?

0
jonaprieto

Prueba esto, espero que esta respuesta te ayude

echo $((`ls -l | wc -l` -1 ))
0
Tiger

Puedes consultar con:

ls -l | grep -v ^l | wc -l
0
AMIC MING