Listado de archivos en un directorio que incluye el contenido de subcarpetas con clasificación

9

Estoy buscando enumerar todo el contenido de un directorio, incluido el contenido de las subcarpetas pero ordenado por tamaño de archivo. Hasta ahora, he logrado llegar a enumerar y ordenar sin dejar de ser recursivo ls -lhSR( hes bueno tenerlo, pero definitivamente no es esencial para mí, siempre que pueda obtener el tamaño de los archivos). Probablemente estoy pasando por alto algo obvio o preguntando lo imposible, pero cualquier consejo aquí sería muy apreciado.

toms
fuente

Respuestas:

15

Puedes usar find:

find . -type f -printf "%s %P\n" | sort -n

Opcional: para convertir valores de bytes a formato legible para humanos, agregue esto:

| numfmt --to=iec-i --field=1

Explicación:

 find in current directory (.) all files (-type f) 

 -printf: suppress normal output and print the following:
     %s - size in bytes
     %P - path to file
     \n - new line

 | sort -n: sort the result (-n = numeric)
pLumo
fuente
¡Oh perfecto! ¡Muchas gracias, esto hizo exactamente lo que necesitaba!
toms
3
Me alegra que mi respuesta te haya ayudado. Considere hacer clic en la marca de verificación en el lado izquierdo para marcar la respuesta aceptada. Gracias.
pLumo
1
@RoVo también sería bueno votar la pregunta ya que, dado que la has respondido, probablemente la encontraste interesante y útil.
terdon
Esto es cierto y lo hice ahora ;-)
pLumo
@toms Está bien esperar un tiempo (tal vez un día más o menos) para aceptar la respuesta, incluso cuando es tan buena como esta. Una vez que se acepta la respuesta, no hay forma de que otra respuesta sea aún mejor. Y debido a eso, muchas personas no se molestarán en enviar ninguna otra respuesta, por lo que no tenemos la oportunidad de verlas para averiguar si uno es mejor.
Monty Harder
7

Como no especificó un shell en particular, aquí hay una alternativa que utiliza los calificadores glob de zsh con

setopt extendedglob

para la recursividad Entonces, por ejemplo:

  1. Lista recursiva de archivos sin formato:

    printf '%s\n' **/*(.)
  2. recursiva lista de archivos planos, o rdered por en arrugar L ength (es decir, tamaño):

    printf '%s\n' **/*(.oL)
  3. Lista de archivos planos de forma recursiva, O rdered por de tamaño plegado:

    printf '%s\n' **/*(.OL)
  4. Haga una lista recursiva de archivos sin formato, ordenados por tamaño decreciente, y seleccione los 3 mejores resultados:

    printf '%s\n' **/*(.OL[1,3])

Si desea los tamaños de archivo también, entonces podría usar

du -hb **/*(.OL[1,3])
conductor de acero
fuente
4

Con el globstarconjunto de opciones de shell, puede usar globbing de shell:

shopt -s globstar         # don’t match hidden files
shopt -s globstar dotglob # match hidden files
stat -c"%s %n" **/* | sort -n

Si lo intenta con demasiados archivos, obtendrá un error de "Lista de argumentos demasiado larga". Para evitar eso, puede usar printfy xargs:

printf "%s\0" **/* | xargs -0 stat -c"%s %n" | sort -n

Me acabo de dar cuenta de que esto también imprime los directorios (con un tamaño de 4096 bytes); si no lo desea, use esto en su lugar:

stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
printf "%s\0" **/* | xargs -0 stat -c"%A %s %n" | sed '/^d/d;s/\S* //' | sort -n

Ejecución de ejemplo

$ tree
.
├── edits.png
├── makescript
├── new
   └── edits.png
└── test
    └── 1.png

2 directories, 4 files
$ stat -c"%s %n" **/* | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
4096 new
4096 test
$ stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
postre
fuente
Buena solución En comparación con encontrar, no incluye archivos ocultos, ¿cómo lograr eso?
pLumo
@RoVo Siempre olvídate de estos: solo necesitas configurar la dotglobopción de shell, mira mi respuesta actualizada.
postre
En lugar de eliminar directorios después del hecho con sed, podría considerar algo comoprintf "%s\0" **/* | xargs -0 sh -c 'for f; do [ -d "$f" ] || stat -c "%s %n" "$f"; done' sh | sort -n
steeldriver
Puede usarlo ls -lhSd **/*si no le importa tener los directorios como parte de la lista. O si ninguno de sus nombres de directorio tiene .en ellos, y todos los archivos que desea hacer , puede ll -hS **/*.*, o similar.
Peter Cordes
convirtió eso en una respuesta
Peter Cordes
3

Si no tiene zsh, aún puede usar du+ sort:

  1. Tamaños legibles por humanos, incluidos los tamaños acumulativos de directorios:

    du --apparent-size -ah0 . | sort -zh | xargs -0L1
    
  2. Solo archivos (usando find):

    find . -type f -print0 |
      du --files0-from=- --apparent-size -ah0 |
      sort -zh |
      xargs -0L1
    

En ambos casos, he optado por utilizar líneas terminadas en cero ( -0, -z, -print0opciones), para estar seguro contra todos los nombres de archivo válidos.

muru
fuente
0

Para un uso interactivo rápido en árboles de directorios que no son demasiado grandes, shopt -s globstares realmente agradable. Un pegote no puede filtrar los directorios basados en el tipo, pero si se utiliza con ls -dcontinuación, lsse acaba de imprimir el nombre del directorio, en lugar de los contenidos.

Asumiendo que tu llalias incluye -lh:

  # with  shopt -s globstar   in your .bashrc
ll -rSd **/*

le dará una salida como esta (desde mi directorio de código de golf), pero con resaltado de color (por lo que es más fácil ver los directorios). Tenga en cuenta que la ordenación por tamaño de archivo se realizó entre subdirectorios.

drwxr-xr-x 1 peter peter   70 Jun  8 07:56 casexchg
...
drwxr-xr-x 1 peter peter  342 Mar 13 18:47 parity-party
-rw-r--r-- 1 peter peter  387 Jul 29  2017 likely.cpp
-rw-r--r-- 1 peter peter  416 Aug 31  2017 true-binary.asm~
-rw-r--r-- 1 peter peter  447 Feb 23 20:14 weight-of-zero.asm
...
-rw-r--r-- 1 peter peter 6.4K Jun  1  2017 string-exponential.asm
-rwxr-xr-x 1 peter peter 6.7K Aug 31  2017 true-binary
-rwxr-xr-x 1 peter peter 6.8K Sep 17  2017 dizzy-integer
-rw-r--r-- 1 peter peter 7.5K Jul 24  2017 fibonacci/fibonacci-1G.v3-working-32b-stack-except-output.asm
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G~
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G
-rwxr-xr-x 1 peter peter 8.4K May 19 04:29 a.out
-rw-r--r-- 1 peter peter 8.9K Jul 25  2017 fibonacci/perf.python-xnor-2n
-rw-r--r-- 1 peter peter 9.5K Jul 26  2017 fibonacci/fibonacci-1G-performance.asm
-rwxr-xr-x 1 peter peter 9.6K Apr 12 23:25 empty-args
-rw-r--r-- 1 peter peter 9.7K Dec 18 17:00 bubblesort.asm
-rwxr-xr-x 1 peter peter 9.9K Feb  6 23:34 parity-party/a.out
-rw-r--r-- 1 peter peter 9.9K Jul 25  2017 fibonacci/fibonacci-1G-performance.asm~
...

Puede filtrar los directorios canalizando grep -v '^d'

A veces puede usar un globo que solo coincida con archivos y no con directorios, si sus nombres de archivo tienen un patrón. por ejemplo ll -rSd **/*.jpg, o incluso **/*.*funciona si ninguno de los nombres de su directorio tiene .en ellos, y todos los archivos que desea hacer .

(Para personas con experiencia en DOS: no hay nada mágico *.*en Unix. Simplemente coincide con cualquier entrada de directorio que contenga un punto literal. Pero aparte de los archivos ejecutables y, a veces, los archivos de texto, es común dar extensiones a los nombres de archivo).

@dessert señala que necesitaría shopt -s dotglobque coincida con todos los archivos.


Con GNU find

Si no hay demasiados archivos para caber en una lslínea de comando, los find -exec ls {} +colocará todos en la línea de comando donde lspuede ordenarlos.

find -not -type d -exec ls --color -lrSh {} +

Usar en -not -type dlugar de -type fevitar ignorar enlaces simbólicos, canalizaciones con nombre, tomas, archivos de dispositivos y cualquier otra cosa que tenga en sus directorios.


Con du:

du -ach | sort -h
....
4.0K    x86-modedetect-polyglot.o
8.0K    ascii-compress-base.asm
8.0K    dizzy-integer
8.0K    stopwatch-rdtsc.asm
8.0K    string-exponential.asm
8.0K    true-binary
12K     a.out
12K     bubblesort.asm
12K     casexchg
12K     empty-args
100K    parity-party
220K    fibonacci
628K    total

Ahora los nombres de los directorios se ordenan en la lista con la suma total de todos sus contenidos, pero los archivos individuales aún se incluyen.

sort -h, también conocido como --human-numeric-sort, ordena números con sufijos de tamaño como du -himpresiones. Es perfecto para usar con du.

A menudo uso du -sch * | sort -h, o */para obtener solo directorios.

du -sch **/* | sort -hle daría el resultado anterior, si olvida que dutiene una -aopción.

(Solo me tomé el tiempo de buscarlo porque estoy publicando una respuesta. Para uso interactivo, probablemente lo hubiera usado du -sch **/*.

Peter Cordes
fuente