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
( h
es 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:
enumerar recursivamente archivos planos:
printf '%s\n' **/*(.)
enumerar recursivamente archivos simples,ohordenado porenarrugandollongitud (es decir, tamaño):
printf '%s\n' **/*(.oL)
enumerar recursivamente archivos simples,ohordenado porDelawaretamaño de arrugado:
printf '%s\n' **/*(.OL)
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 globstar
opció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 printf
y 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 globstar
es muy agradable. Un globo no puede filtrar directorios según el tipo, pero si lo usa, ls -d
simplemente ls
imprimirá el nombre del directorio, en lugar del contenido.
Suponiendo que su ll
alias 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 dotglob
que coincidatodoarchivos.
Con GNUfind
Si no hay demasiados archivos para caber en una ls
línea de comando, find -exec ls {} +
los colocará todos en la línea de comando donde ls
pueda ordenarlos.
find -not -type d -exec ls --color -lrSh {} +
Usar -not -type d
en lugar de -type f
evita 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 -h
impresiones. Es perfecto para usar con du
.
A menudo uso du -sch * | sort -h
o */
para obtener solo directorios.
du -sch **/* | sort -h
le daría el resultado anterior, si olvida que du
tiene una -a
opción.
(Solo me tomé el tiempo de buscarlo porque estoy publicando una respuesta. Para uso interactivo, probablemente simplemente habría usado du -sch **/*
.