Listado de archivos en un directorio, incluido el contenido de subcarpetas con clasificación

Listado de archivos en un directorio, incluido el contenido de subcarpetas con clasificación

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

Respuesta1

Puedes usar buscar:

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

Opcional: para convertir valores de bytes a formato legible por 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)

Respuesta2

Como no especificaste un shell en particular, aquí tienes una alternativa que utiliza los calificadores globales de zsh con

setopt extendedglob

para la recursividad. Entonces por ejemplo:

  1. enumerar recursivamente archivos planos:

    printf '%s\n' **/*(.)
    
  2. enumerar recursivamente archivos simples,ohordenado porenarrugandollongitud (es decir, tamaño):

    printf '%s\n' **/*(.oL)
    
  3. enumerar recursivamente archivos simples,ohordenado porDelawaretamaño de arrugado:

    printf '%s\n' **/*(.OL)
    
  4. enumere recursivamente archivos simples, ordenados por tamaño decreciente y seleccione los 3 primeros resultados:

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

Si también desea los tamaños de archivo, puede usar

du -hb **/*(.OL[1,3])

Respuesta3

Con la globstaropción de shell configurada, puedes usar el global de shell:

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

Si intenta esto con demasiados archivos, obtendrá el error "Lista de argumentos demasiado larga". Para solucionar esto, 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 quieres eso, usa 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

Respuesta4

Para un uso interactivo rápidoen árboles de directorios que no sean demasiado grandes,shopt -s globstares muy agradable. Un globo no puede filtrar directorios según el tipo, pero si lo usa, ls -dsimplemente lsimprimirá el nombre del directorio, en lugar del contenido.

Suponiendo que su llalias incluya -lh:

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

le dará un resultado como este (de mi directorio code-golf), pero con resaltado de color (para que sea más fácil ver los directorios). Tenga en cuenta que la clasificació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 canalizandogrep -v '^d'

A veces puedes usar un globo que solo coincida con archivos y no con directorios, si tus nombres de archivos tienen un patrón. por ejemplo ll -rSd **/*.jpg, o incluso **/*.*funciona si ninguno de los nombres de su directorio contiene ., y todos los archivos que deseahacer.

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

@dessert señala que necesitarías shopt -s dotglobque coincidatodoarchivos.


Con GNUfind

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

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

Usar -not -type den lugar de -type fevita ignorar enlaces simbólicos, canalizaciones con nombre, sockets, 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 para sumar el 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 -ho */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 simplemente habría usado du -sch **/*.

información relacionada