Cómo enumerar todos los archivos ordenados por tamaño


241

Me gustaría enumerar todos los archivos en el orden de tamaño grande a pequeño y los archivos podrían estar presentes en cualquier lugar de una carpeta determinada.



55
desde man ls:-S sort by file size
ctrl-alt-delor

¿Quiere decir que "los archivos están en este directorio", o "los archivos pueden estar en cualquier subdirectorio"?
ctrl-alt-delor

Si puede / desea utilizar una herramienta GUI, eche un vistazo a QDirStat , anteriormente KDirStat .
RhinoDevel

Respuestas:


290

Simplemente use algo como:

ls -lS /path/to/folder/

Capital S .

Esto ordenará los archivos por tamaño.

Ver también:

man ls

-S     sort by file size

Si desea ordenar en orden inverso , simplemente agregue el -rinterruptor.

Actualizar:

Para excluir directorios (y siempre que ninguno de los nombres de archivo u objetivos de enlaces simbólicos contengan caracteres de nueva línea):

ls -lS | grep -v '^d' 

Actualización 2:

Ahora veo cómo todavía muestra enlaces simbólicos, que podrían ser carpetas. Los enlaces simbólicos siempre comienzan con una letra l, como en el enlace.

Cambie el comando para filtrar por a -. Esto solo debería dejar archivos regulares:

ls -lS | grep '^-'

En mi sistema, esto solo muestra archivos normales.

actualización 3:

Para agregar recursividad, dejaría la clasificación de las líneas al sortcomando y le diría que use la quinta columna para ordenar.

ls -lR | grep '^-' | sort -k 5 -rn

-rnsignifica Inverso y numérico para obtener los archivos más grandes en la parte superior. La desventaja de este comando es que no muestra la ruta completa de los archivos.

Si necesita la ruta completa de los archivos, use algo como esto:

find . -type f  -exec du -h {} + | sort -r -h

El findcomando buscará recursivamente todos los archivos en todos los subdirectorios .y llamará du -h(lo que significa que el uso del disco es legible ) y luego ordenará la salida nuevamente. Si su find/ sortno es compatible -h, reemplace con du -ky sort -rn. Tenga en cuenta que el tamaño y el uso del disco no son lo mismo.


55
duda el uso del disco que es diferente del tamaño del archivo. Con (GNU) du -h, la ordenación numérica no funcionará (necesitará la -hopción GNU para ordenar). xargs espera una lista de palabras posiblemente citadas como entrada, por lo que no funcionará si los nombres de archivo contienen espacios en blanco o caracteres entre comillas.
Stéphane Chazelas

1
Veo que -S tiene un orden de tamaño descendente, ¿qué pasa con el orden ascendente?
demongolem

3
Tras @ StéphaneChazelas, esto funciona para mí: find . -type f -print0 | xargs -0 du -h | sort -rh. Si lo que desea es decir los mayores de 30 archivos: find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30.
user7543

¡Hola! ¿Podría explicar la + |sintaxis en + | sort -r -h?
Víctor el


25

Podrías usar algo como buscar y ordenar.

find . -type f -ls | sort -r -n -k7

(la -lsopción no es estándar, pero se encuentra en muchas implementaciones de búsqueda, no solo en GNU. En GNU find y otras, muestra algo similar a ls -lialgunas excepciones, por ejemplo, los archivos con ACL no están marcados con un +)

Si los nombres de archivo pueden contener caracteres de nueva línea, con GNU find y GNU sort:

find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'

Esto supone que la columna "grupo" (de -ls) no contiene ningún espacio (de ahí el parámetro -k 7), pero no es necesariamente el caso.
kolistivra el

1
¿por qué no simplemente hacer find ... -print0 | ordenar -zk7rn0?
Andre de Miranda

10

Con zsh y GNU ls:

ls -ldU -- **/*(.OL)

Donde (.OL)hay un calificador global , .para seleccionar solo archivos regulares , OLpara invertir el orden por longitud (tamaño del archivo, o para orden ascendente, Opara descendente).

(tenga en cuenta que las versiones anteriores de zsh tenían problemas con los tamaños de archivo superiores a 2 ^ 32).

Algunos sistemas operativos tienen un límite en el tamaño de la lista de argumentos que se pasa a un comando. En esos casos, necesitarías:

autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU

Si solo desea la lista de archivos y no la salida detallada, simplemente haga lo siguiente:

print -rl -- **/*(.OL)

Si desea incluir archivos ocultos (cuyo nombre comienza con un punto, excepto .y ..) y buscar también en directorios ocultos, agregue el Dcalificador global:

print -rl -- **/*(.DOL)

lo que hace el .OLhacer? ¿Es eso parte del comando?
alpha_989

@ alpha_989, ver edición
Stéphane Chazelas

Gracias por la explicación, Stephane ... Sin embargo, por alguna razón ... el comando no funciona en mi estación de trabajo ... Estoy usando ls (GNU coreutils) 8.25y zsh 5.1.1 (x86_64-ubuntu-linux-gnu). ¿Funciona solo para ciertas versiones de lsy zsh?
alpha_989

@ alpha_989, ¿de qué manera no te funciona? Funciona para mí con esas mismas versiones y no hay nada en ese código que no hubiera funcionado en las versiones de hace 15 años al menos.
Stéphane Chazelas

9

La lista de archivos por tamaño ascendente sería:

ls -lSr

Las opciones son:

  • l: largo, muestra usuario detallado, grupo, otros atributos, fecha, etc.
  • S: pedidos listados por tamaño (descendiendo por defecto)
  • r: invierte el orden de listado

¿Te importaría explicar las opciones para mejorar la calidad de la respuesta?
Rui F Ribeiro

6

Decir que "los archivos podrían estar presentes en cualquier lugar de una carpeta determinada" implica que desea descender recursivamente todos los directorios (carpetas) dentro del directorio (carpeta) de inicio. Esto es lo findque debe hacer:

find . -type f -exec ls -lSd {} +

Esto "encuentra" todos los archivos en el directorio de trabajo actual ( .). Para cada archivo encontrado, lsse ejecuta un proceso para ordenar los objetos encontrados en orden de tamaño. El +terminador del -exechace que se pasen múltiples argumentos como una lista a ls. A menos que su directorio (carpeta) contenga una gran cantidad de archivos, debe tener una lista (y, por lo tanto, un proceso bifurcado), que conduzca al resultado que desea.


1
esto es bueno ya que le permite usar el modificador -h en ls para mostrar tamaños de archivo agradables
shmish111

4

Visualización de la lista de archivos en orden inverso: ls -lSrh

Para orden ascendente: ls -lSh


1
+1 para usar la bandera -h para una salida amigable para los humanos.
computingfreak

2

Escribí algo en este sentido hace un tiempo. Podrías pasar un argumento para especificar cuántos archivos listar, o simplemente escribir big, en cuyo caso obtienes 10.

big () { 
    NUM_FILES=10;
    if [ $1 ]; then
        NUM_FILES=$1;
    fi;
    du | sort -nr | head -n $NUM_FILES
}

2

Prueba estos, funciona bien para mí.

$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10

# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'

Sin embargo, no es una respuesta perfecta, pero funciona hasta cierto punto

$ ls -lS |grep  '^-' | head -n 6 

1
awk funciona bien si los nombres de archivo no contienen espacios.
Eir Nym

sí ... usa 'sed' y reemplaza el espacio con guión bajo? si eso ayuda
Sand1512

No, yo uso sedpara cortar la producción
Eir Nym

1

Agregando a la respuesta de Delh y al comentario de Stéphane Chazelas ...

find -print0combinado con xargs -0agrega soporte para espacios en blanco / espacios / whatnots.

du -h | sort -rn no se ordena correctamente entre diferentes bytes, por ejemplo, 1.1M se mostrará después de 128K, lo cual es incorrecto.

sort -rh (--human-numeric-sort) se encarga de eso, pero solo funciona en la versión de GNU.

Los siguientes comandos proporcionarán la salida deseada.

Legible por humanos, en GNU's sort / Linux:

find . -type f -print0 | xargs -0 du -h | sort -rh

En unidades de kilobytes, en BSD / OSX / otros:

find . -type f -print0 | xargs -0 du -k | sort -rn

Para BSD / OSX, consulte también https://unix.stackexchange.com/a/188375/82895 .


1

Como una variación de la pregunta original, si desea ver el tamaño acumulativo de los archivos en los subdirectorios:

#!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr

Los tamaños se mostrarán en Megabytes (el mde du -sm). Otros valores aceptados por duson -kpara kilobytes, -gpara gigabytes. El uso -hde la pantalla legible por humanos no es posible porque se romperá la clasificación.

Aquí hay una versión que utiliza sedpara agregar el Mmegabyte:

find ${1:-.} -maxdepth 1  -type d  -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/\1M/g'

El directorio para mostrar se establece mediante el ${1:-.}cual usará el primer argumento de línea de comando si se proporciona, o usará el directorio actual si se llama sin argumentos.

NOTA: Esto puede llevar mucho tiempo con muchos archivos. La opción -type dsolo enumerará subdirectorios y excluirá archivos en la carpeta actual; si también desea ver los archivos en la carpeta actual, elimínelos.

Nota: es posible que desee utilizar ncduen su lugar el que está disponible en la mayoría de los repositorios de Linux (en ubuntu / debian apt install ncdu), así como en osx ( brew install ncdu).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.