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

Tengo un directorio con un gran número de archivos. No veo un interruptor ls para proporcionar el recuento. ¿Hay alguna magia de línea de comandos para obtener un recuento de archivos?

Solución

Utilizando una definición amplia de "archivo&quot";

ls | wc -l

(tenga en cuenta que no cuenta los archivos ocultos y asume 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 //
Comentarios (6)

Para una definición estricta de archivo:

 find . -maxdepth 1 -type f | wc -l
Comentarios (4)

idioma: sh -->

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

set -- *; echo "$#"

Esto es obviamente generalizable a cualquier glob.

En un script, esto tiene el desafortunado efecto secundario de sobrescribir los parámetros posicionales. Puede evitarlo utilizando un 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 puede acortarse a $(ls | wc -l). Analizar la salida de ls siempre me inquieta, pero aquí debería funcionar siempre que los nombres de tus archivos no contengan nuevas líneas, o que tu ls las escape. Y $(ls -d -- * 2>/dev/null | wc -l) tiene la ventaja de manejar el caso de un glob no coincidente con gracia (es decir, devuelve 0 en ese caso, mientras que el método set * requiere una prueba complicada si el glob podría estar vacío).

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

Cualquiera de estas soluciones que se basan en pasar la expansión de un glob a ls puede fallar con un error de lista de argumentos demasiado larga si hay muchos archivos que coinciden.

Comentarios (6)