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

24

Necesito organizar un HDD externo para que no haya más de 500 carpetas en él. El panel "Propiedades" de Ubuntu muestra solo el recuento de archivos, no el recuento de carpetas.

¿Hay una línea de comando simple que me diga el número de subdirectorios?

Necesito contar recursivamente, y la unidad es un HDD externo montado en /media/MUSIC/. Es para un sistema estéreo de automóvil cuya documentación dice que solo lee las primeras 500 carpetas.

Dean Rather
fuente

Respuestas:

20

Navega a tu disco y simplemente ejecuta

ls -lR | grep ^d | wc -l
Aniket Thakur
fuente
Esto parece proporcionar un número más correcto que la respuesta que acepté hace 3 años. Contó el directorio en el que estaba, mientras que esto no lo hizo.
Dean Rather
También veo números diferentes, pero no muy diferentes.
SPRBRN
Personalmente prefiero el grep -csobre el wc -l. Tal vez solo soy yo.
Maxim_united
1
Lo anterior contará en exceso si alguna entrada del directorio contiene la secuencia \nd(donde \nestá el carácter NL).
Toby Speight
1
Toby tiene razón, lsno se supone que la salida se canalice . Además, este será mucho más lento, ya que tiene a todo el árbol de salida y ejecute grep a través de él
phuclv
37

¿Encontrar todas las carpetas en total, incluidos los subdirectorios?

find /mount/point -type d | wc -l

... o encuentra todas las carpetas en el directorio raíz (sin incluir subdirectorios)?

find /mount/point -maxdepth 1 -type d | wc -l
quijote curandero
fuente
Ese primero es exactamente lo que busco. ¡Gracias!
Dean Rather
@Dean: sí, también lo he usado para contar directorios en mi colección de música. :) para alardear de derechos, cuente sus archivos MP3: find / mount / point -type f | grep -i mp3 | wc -l
quack quijote
1
@Dean: sí, no conozco la sintaxis de búsqueda de improviso, pero generalmente usaría grep -v para eso: find / mount / pt -type f | grep -vi mp3 | grep -vi wav | wc -l ... (y <i> </i> no funciona en los comentarios, se usa *foo*para poner en cursiva: foo )
quack quixote
2
@Dean: creo que solo usarías find /path -not -iname '*.mp3' | wc -lpara filtrar MP3, o para usar MP3 y WAVfind /path -not -iname '*.mp3' -not -iname '*.wav' | wc -l
quack quixote
1
Necesitaba agregar el tipo f para que también ignorara las carpetas, ¡pero felicidades! Acabo de encontrar un montón de archivos m4a sobre los que no tenía idea ... ¡Gracias!
Dean Rather
4

Las nuevas líneas son caracteres válidos en los nombres de directorio. Sugiero dejar findimprimir una línea vacía para cada directorio encontrado y luego dejar de wccontar esas líneas.

find /mount/point -type d -printf '\n' | wc -l
Erik Sjölund
fuente
3

Pruebe lo siguiente [ver abajo]:

ls -1 -p | grep "/" | wc -l

Esto imprimirá una lista de una columna del directorio actual, con barras diagonales finales para los elementos que son subdirectorios, luego contará las líneas con las barras diagonales.

EDITAR: probablemente debería ir con la respuesta de quack quixote, ya que es un poco más explícito, pero he corregido la mía (después de tener en cuenta las sugerencias de quack).

ls -Rp | grep "/$" | wc -l
acrobacias
fuente
Necesito agregar -R para que sea recursivo (perdón por no mencionar), y necesito especificar la ruta a ls, pero sí, esto funciona: ls -1 -p -R / media / MUSIC / | grep "/" | wc -l Gracias!
Dean Rather
Después de probar esto y la sugerencia del quijote quack, obtuve 2 resultados diferentes ... Me inclino a creer el otro. ¡Gracias de cualquier manera!
Dean Rather
1
no necesita el -1ya que ls detectará la tubería y no formateará las columnas. también puede tomar listados recursivos con -R, pero probablemente desee buscar "/$"solo para que coincidan las barras diagonales finales (o el recuento estará desactivado). versión final:ls -Rp | grep "/$" | wc -l
quckote quack
1
la versión de búsqueda que publiqué contará .(es decir /mount/point) en su recuento, la versión ls en mi comentario anterior no contará. esos recuentos difieren en 1, aunque podría usarlos /mount/point/*en el comando de búsqueda para corregir eso (suponiendo que no haya directorios de puntos ocultos).
quack quijote
No estoy seguro de por qué obtuviste los dos resultados diferentes, pero el método de @ quack incluirá directorios "ocultos" (es decir, aquellos que comienzan con '.').
stuntmouse
1

He escrito ffcnt para acelerar el recuento recursivo de archivos en circunstancias específicas: discos rotativos y sistemas de archivos que admiten la asignación de extensión.

Puede ser un orden de magnitud más rápido que eso lso findenfoques basados

the8472
fuente
1

Cuando hay una gran cantidad de directorios, las herramientas como treepueden tardar una eternidad en terminar o incluso bloquearse, por lo que es posible que desee utilizar algo más eficiente.

La forma más eficiente de contar los directorios en los que puedo pensar sería la siguiente, ya findque solo imprimirá uno .para cada carpeta encontrada en lugar de la ruta completa y el nombre del archivo y wcsolo necesita iterar sobre el número de caracteres:

find /mount/point -type d -printf '.' |wc -c

Para excluirse /mount/pointdel cálculo y solo contar los subdirectorios:

find /mount/point -mindepth 1 -type d -printf '.' |wc -c
David
fuente
1

He encontrado du --inodesútil, pero no estoy seguro de qué versión durequiere. 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 -nrpara ordenar descendente por número de inodos que contienen.

krlmlr
fuente
0

Me gusta usar el árbol para extraer el recuento de directorios con

tree -d -R -fi --noreport | wc -l

O usaré find para mostrar que la mayoría de las carpetas están ubicadas con

find . -type d -printf "%h\n" | cut -d/ -f-2 | sort | uniq -c | sort -rn
Cameron L.
fuente
O algo así como: árbol | grep -e '^. * directorios,'
mindcrime
-2

Para buscar el número de carpetas y el directorio en el directorio actual

Escribe el siguiente comando en tu terminal

echo */ | wc
RANJAN CENIZO
fuente