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.
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
globstarconjunto 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
printfyxargs: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
dotglobopció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 -nls -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,-print0opciones), 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 globstares realmente agradable. Un pegote no puede filtrar los directorios basados en el tipo, pero si se utiliza conls -dcontinuación,lsse acaba de imprimir el nombre del directorio, en lugar de los contenidos.Asumiendo que tu
llalias 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 dotglobque coincida con todos los archivos.Con GNU
findSi no hay demasiados archivos para caber en una
lslínea de comando, losfind -exec ls {} +colocará todos en la línea de comando dondelspuede ordenarlos.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: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 -himpresiones. Es perfecto para usar condu.A menudo uso
du -sch * | sort -h, o*/para obtener solo directorios.du -sch **/* | sort -hle daría el resultado anterior, si olvida quedutiene una-aopción.(Solo me tomé el tiempo de buscarlo porque estoy publicando una respuesta. Para uso interactivo, probablemente lo hubiera usado
du -sch **/*.fuente