Cuente recursivamente todos los archivos en un directorio [duplicado]

199

Posible duplicado:
¿Cómo puedo contar el número de carpetas en una unidad usando Linux?

Tengo un árbol de directorios realmente profundo en mi caja de Linux. Me gustaría contar todos los archivos en esa ruta, incluidos todos los subdirectorios.

Por ejemplo, dado este árbol de directorios:

/home/blue
/home/red
/home/dir/green
/home/dir/yellow
/home/otherDir/

Si paso /home, me gustaría que devuelva cuatro archivos. O puntos de bonificación si devuelve cuatro archivos y dos directorios. Básicamente, quiero el equivalente de hacer clic con el botón derecho en una carpeta en Windows y seleccionar propiedades y ver cuántos archivos / carpetas hay en esa carpeta.

¿Cómo puedo hacer esto más fácilmente? Tengo una solución que involucra un script de Python que escribí, pero ¿por qué no es tan fácil como ejecutar ls | wco similar?

omghai2u
fuente
No es exactamente lo que está buscando, pero para obtener un gran total muy rápido, si su locatebase de datos está actualizada: locate /some/path | wc -l(o en mi Mac:) locate -c /some/path. Pero: esto también contará los archivos /this/other/path/with/some/pathy contará las carpetas en sí.
Arjan
Por cierto, este es un problema diferente, pero estrechamente relacionado (contando todos los directorios en una unidad) y solución: superuser.com/questions/129088/…
Amanda

Respuestas:

341

find . -type f | wc -l

Explicación:
find . -type fencuentra todos los archivos ( -tipo f ) en este directorio ( . ) Y en todos los subdirectorios, los nombres de los archivos se imprimen en uno estándar por línea.

Esto luego se canaliza | into wc(word count) la -lopción le dice a wc que solo cuente líneas de su entrada.

Juntos cuentan todos sus archivos.

Nifle
fuente
1
Esto no se ocupa del error off-by-one debido a la última nueva línea de la findsalida
RobertDeRose
para contar directorios SOLAMENTE, use '-type d' en lugar de '-type f': D
MevlütÖzdemir
1
Cuando no se encuentran archivos, el resultado es1
Dylanthepiguy
47

Las respuestas anteriores ya responden la pregunta, pero agregaré eso si usa find sin argumentos (excepto la carpeta donde desea que se realice la búsqueda) como en:

find . | wc -l

la búsqueda va mucho más rápido, casi instantáneo, o al menos lo hace para mí. Esto se debe a que la cláusula type tiene que ejecutar una llamada al sistema stat () en cada nombre para verificar su tipo; omitirlo evita hacerlo.

Esto tiene la diferencia de devolver el recuento de archivos más carpetas en lugar de solo archivos, pero al menos para mí es suficiente, ya que lo uso principalmente para encontrar qué carpetas tienen grandes cantidades de archivos que tardan una eternidad en copiarlos y comprimirlos. Contar carpetas todavía me permite encontrar las carpetas con la mayoría de los archivos, necesito más velocidad que precisión.

Francisco Vieira
fuente
1
Cuando no se encuentran archivos, el resultado es1
Dylanthepiguy
25

Para archivos:

find -type f | wc -l

Para directorios:

find -mindepth 1 -type d | wc -l

Ambos trabajan en el directorio de trabajo actual.

Ciro
fuente
1
Cuando no se encuentran archivos, el resultado es1
Dylanthepiguy
8

Con bash 4+

shopt -s globstar
for file in **/*
do
  if [ -d "$file" ];then
    ((d++))
  elif [ -f "$file" ];then
     ((f++))
  fi
done
echo "number of files: $f"
echo "number of dirs: $d"

No es necesario llamar a find dos veces si desea buscar archivos y directorios

usuario31894
fuente
8

Ligera actualización a la respuesta aceptada, si desea un recuento de directorios y tal

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn
Rich Homolka
fuente
1
En una Mac / BSD : find $DIR -exec stat -f '%HT' {} \; | sort | uniq -c | sort -rn(Aquí, el tipo %Testá vacío para un archivo normal, un asterisco para un archivo ejecutable o una barra oblicua para una carpeta; por %HTlo tanto, se necesita o algún texto adicional para evitar que el espacio no se cuente, como > %T. )
Arjan
Me da "encontrar: opción ilegal - e" en mi Mac 10.13.6
K.-Michael Aye