Puedo enumerar todos los directorios por
find ./ -type d
Intenté enumerar el contenido de cada directorio y contar el número de archivos en cada directorio usando el siguiente comando
find ./ -type d | xargs ls -l | wc -l
Pero esto sumaba el número total de líneas devueltas por
find ./ -type d | xargs ls -l
¿Hay alguna manera de contar el número de archivos en cada directorio?
./
?Respuestas:
Suponiendo que tiene GNU buscar, deje que busque los directorios y deje que bash haga el resto:
fuente
find . -maxdepth 1 -type d | sort
; hacer y =find $x | wc -l
; echo $ x, $ y; hechofind . -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in directory %s\n" "${#files[@]}" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find $dir -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done | sort -rn -k1
$dir
debe estar entre comillas en su primer comentario para manejar correctamente los nombres de directorio con espacios en blanco. :find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
Esto imprime el recuento de archivos por directorio para el nivel de directorio actual:
fuente
du -a | sed '/.*\.\/.*\/.*/!d' | cut -d/ -f2 | sort | uniq -c
. Agregar| sort -nr
para ordenar por el recuento en lugar del nombre del directorio.find. -type f
para encontrar todos los elementos del archivo de tipocut -d/ -f2
para recortar su carpeta específicasort
para ordenar la lista de nombres de carpetasuniq -c
para devolver el número de veces que se ha contado cada nombre de carpetafuente
find . -type f | cut -d/ -f2,3 | sort | uniq -c
Puede hacer arreglos para encontrar todos los archivos, eliminar los nombres de los archivos, dejando una línea que contenga solo el nombre del directorio para cada archivo, y luego contar el número de veces que aparece cada directorio:
El único problema en esto es si tiene algún nombre de archivo o nombre de directorio que contenga un carácter de nueva línea, lo cual es bastante improbable. Si realmente tiene que preocuparse por las nuevas líneas en los nombres de archivos o directorios, le sugiero que las encuentre y las arregle para que no contengan nuevas líneas (y persuadir silenciosamente a la parte culpable del error de sus formas).
Si está interesado en el recuento de archivos en cada subdirectorio del directorio actual, contando los archivos en cualquier subdirectorio junto con los archivos en el subdirectorio inmediato, adaptaría el
sed
comando para imprimir solo el directorio de nivel superior:El primer patrón captura el comienzo del nombre, el punto, la barra, el nombre hasta la siguiente barra y la barra, y reemplaza la línea con solo la primera parte, así:
es reemplazado por
El segundo reemplazo captura los archivos directamente en el directorio actual; no tienen una barra al final y se reemplazan por
./
. La ordenación y el recuento funcionan solo con el número de nombres.fuente
find
. Algunos podrían: si hay un archivodir1/dir2/dir3/file1
, perodir1/dir2
contiene solo subdirectorios (no archivos planos), entonces puede inferir su presencia. Pero sidir1/dir4
no tiene archivos, su nombre simplemente no aparece.Aquí hay una forma de hacerlo, pero probablemente no sea la más eficiente.
Da un resultado como este, con el nombre del directorio seguido del recuento de entradas en ese directorio. Tenga en cuenta que el recuento de salida también incluirá las entradas del directorio que pueden no ser las que desea.
fuente
bash
,ls
,wc
) para cada directorio encontrado porfind
.man bash
,A -- signals the end of options and disables further option processing
. En este caso, evitaría que un archivo con nombre incorrecto encontrado como parte del hallazgo se convierta en parte del procesamiento de argumentos de bash.La solución de todos los demás tiene un inconveniente u otro.
Explicación:
-type d
: estamos interesados en directorios.-readable
: Solo los queremos si es posible enumerar los archivos que contienen. Tenga en cuenta quefind
seguirá emitiendo un error cuando intente buscar más directorios en ellos, pero esto evita llamarlos-exec
.-exec sh -c BLAH sh {} ';'
: Para cada directorio, ejecute este fragmento de secuencia de comandos, con el$0
conjunto desh
y$1
conjunto al nombre de archivo.printf "%s " "$1"
: imprime de forma portátil y mínima el nombre del directorio, seguido de un espacio, no de una nueva línea.ls -1UA
: enumera los archivos, uno por línea, en orden de directorio (para evitar atascar la tubería), excluyendo solo los directorios especiales.
y..
wc -l
: cuenta las líneasfuente
find -type d -readable -exec sh -c 'ls -1UA "$1" | wc -l | tr -d "\n" ; printf "\t%s\n" "$1" ' sh {} ';' | sort -n
Versión ligeramente modificada de la respuesta de Sebastian usando en
find
lugar dedu
(para excluir la sobrecarga relacionada con el tamaño del archivo quedu
debe realizarse y que nunca se usa):-mindepth 2
El parámetro se usa para excluir archivos en el directorio actual. Si lo quita, verá un montón de líneas como las siguientes:(muy parecido al
du
variante basada en)Si también necesita contar los archivos en el directorio actual, use esta versión mejorada:
La salida será como la siguiente:
fuente
Esto también se puede hacer recorriendo ls en lugar de buscar
for f in */; do echo "$f -> $(ls $f | wc -l)"; done
Explicación:
for f in */;
- recorrer todos los directoriosdo echo "$f ->
- imprime el nombre de cada directorio$(ls $f | wc -l)
- llamar a ls para este directorio y contar líneasfuente
for f ./* ; do echo $f $(ls "$f" | wc -l); done
Esto debería devolver el nombre del directorio seguido del número de archivos en el directorio.
Salida de ejemplo:
El
export -f
es necesario porque el-exec
argumento defind
no permite ejecutar una función bash a menos que invoques bash explícitamente, y necesitas exportar la función definida en el alcance actual al nuevo shell explícitamente.fuente
./dir1/dir2/dir3
(contar los archivosdir1
y sus subdirectorios todos juntos, en lugar de contar los archivos pordir1/dir2/dir3
separado de los dedir1/dir2
y ambos por separado de los de/dir1
).Combiné la respuesta de Jackman @glenn y la respuesta de @ pcarvalho (en la lista de comentarios, hay algo mal con la respuesta de pcarvalho debido a que la función de control de toque de estilo de caracteres ' ` '(tilde)).
Mi script puede aceptar la ruta como un aumento y ordenar la lista de directorios como
ls -l
, también puede manejar el problema del "espacio en el nombre del archivo" .Mi primera respuesta en stackoverflow, y espero que pueda ayudar a alguien ^ _ ^
fuente
encontrar . -type f -printf '% h \ n' | ordenar | uniq -c
da por ejemplo:
fuente
Intenté con algunos de los otros aquí, pero terminé con subcarpetas incluidas en el recuento de archivos cuando solo quería los archivos. Esto se imprime
./folder/path<tab>nnn
con el número de archivos, sin incluir las subcarpetas, para cada subcarpeta de la carpeta actual.fuente
Una forma sencilla de buscar archivos de un tipo determinado de forma recursiva. En este caso, archivos .jpg para todas las carpetas del directorio actual:
find . -name *.jpg -print | wc -l
fuente
Un comando milagroso súper rápido, que atraviesa archivos de forma recursiva para contar la cantidad de imágenes en un directorio y organizar la salida por extensión de imagen:
Créditos: https://unix.stackexchange.com/a/386135/354980
fuente
Esta podría ser otra forma de navegar por las estructuras de directorio y proporcionar resultados detallados.
fuente
Edité el guión para excluir todos
node_modules
directorios dentro del analizado.Esto se puede usar para verificar si el número de archivos del proyecto excede el número máximo que el observador de archivos puede manejar.
Para comprobar la cantidad máxima de archivos que puede ver su sistema:
node_modules
La carpeta debe agregarse a las rutas excluidas de su IDE / editor en sistemas lentos, y el recuento de otros archivos no debe exceder idealmente el máximo (aunque se puede cambiar).fuente
Esto le dará el recuento general.
fuente