desarrollo-web-br-bd.com

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

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.

268
Joe

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 orden inverso , simplemente agregue -r interruptor.

Actualización:

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 un -. 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 en el comando sort y le diría que use la quinta columna para ordenar.

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

-rn significa 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 comando find buscará recursivamente todos los archivos en todos los subdirectorios de . y llama du -h (que significa uso de disco -humanreadable ) y luego ordena la salida nuevamente. Si su find/sort no admite -h, reemplazar con du -k y sort -rn. Tenga en cuenta que el tamaño y el uso del disco no son lo mismo.

308
delh

Podrías usar algo como buscar y ordenar.

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

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

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'
26
Mark Cohen

Con zsh y GNU ls:

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

Dónde (.OL) es un calificador global de , . para seleccionar archivos regulares solamente, OL para invertir el orden por longitud (tamaño del archivo, o para orden ascendente , O para descender).

(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 busque también en directorios ocultos, agregue el calificador global de D:

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

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
9
Baker

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 que find debe hacer:

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

Esto "encuentra" todo archivos en el directorio de trabajo actual (.). Para cada archivo encontrado, se ejecuta un proceso ls para ordenar los objetos encontrados en orden de tamaño. Los + terminador de la -exec hace que se pasen varios 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.

7
JRFerguson

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 
4
Sand1512

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

Para orden ascendente: ls -lSh

4
user174839

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

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

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

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

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

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, también vea https://unix.stackexchange.com/a/188375/82895 .

1
djule5

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 m en du -sm). Otros valores aceptados por du son -k para kilobytes, -g para gigabytes. Utilizando -h para visualización legible para humanos no es posible porque interrumpirá la clasificación.

Aquí hay una versión que usa sed para agregar el M para megabyte:

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

El directorio para mostrar se establece a través de ${1:-.} que usará el primer argumento de la 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 d solo 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 ncdu 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).

1
ccpizza