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
( h
es 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.
9
Como no especificó un shell en particular, aquí hay una alternativa que utiliza los calificadores glob de zsh con
para la recursividad Entonces, por ejemplo:
Lista recursiva de archivos sin formato:
recursiva lista de archivos planos, o rdered por en arrugar L ength (es decir, tamaño):
Lista de archivos planos de forma recursiva, O rdered por de tamaño plegado:
Haga una lista recursiva de archivos sin formato, ordenados por tamaño decreciente, y seleccione los 3 mejores resultados:
Si desea los tamaños de archivo también, entonces podría usar
fuente
Con el
globstar
conjunto de opciones de shell, puede usar globbing de shell:Si lo intenta con demasiados archivos, obtendrá un error de "Lista de argumentos demasiado larga". Para evitar eso, puede usar
printf
yxargs
: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:
Ejecución de ejemplo
fuente
dotglob
opción de shell, mira mi respuesta actualizada.printf "%s\0" **/* | xargs -0 sh -c 'for f; do [ -d "$f" ] || stat -c "%s %n" "$f"; done' sh | sort -n
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 , puedell -hS **/*.*
, o similar.Si no tiene zsh, aún puede usar
du
+sort
:Tamaños legibles por humanos, incluidos los tamaños acumulativos de directorios:
Solo archivos (usando
find
):En ambos casos, he optado por utilizar líneas terminadas en cero (
-0
,-z
,-print0
opciones), para estar seguro contra todos los nombres de archivo válidos.fuente
Para un uso interactivo rápido en árboles de directorios que no son demasiado grandes,
shopt -s globstar
es realmente agradable. Un pegote no puede filtrar los directorios basados en el tipo, pero si se utiliza conls -d
continuación,ls
se acaba de imprimir el nombre del directorio, en lugar de los contenidos.Asumiendo que tu
ll
alias incluye-lh
: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.
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 dotglob
que coincida con todos los archivos.Con GNU
find
Si no hay demasiados archivos para caber en una
ls
línea de comando, losfind -exec ls {} +
colocará todos en la línea de comando dondels
puede ordenarlos.Usar en
-not -type d
lugar de-type f
evitar ignorar enlaces simbólicos, canalizaciones con nombre, tomas, archivos de dispositivos y cualquier otra cosa que tenga en sus directorios.Con
du
: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 comodu -h
impresiones. Es perfecto para usar condu
.A menudo uso
du -sch * | sort -h
, o*/
para obtener solo directorios.du -sch **/* | sort -h
le daría el resultado anterior, si olvida quedu
tiene una-a
opción.(Solo me tomé el tiempo de buscarlo porque estoy publicando una respuesta. Para uso interactivo, probablemente lo hubiera usado
du -sch **/*
.fuente