Ordenar archivos de acuerdo con el tamaño de forma recursiva


79

Necesito encontrar los archivos más grandes en una carpeta.
¿Cómo escaneo una carpeta de forma recursiva y clasifico el contenido por tamaño?

He intentado usar ls -R -S, pero esto también enumera los directorios.
También intenté usar find.


1
¿Desea enumerar los archivos en cada subdirectorio por separado o desea encontrar todos los archivos en todos los subdirectorios y enumerarlos por tamaño, independientemente de en qué subdirectorio se encuentren? Además, ¿qué quieres decir con "directorio" y "carpeta"? Parece que los estás usando para describir cosas diferentes.
terdon

¿Está diciendo que solo desea enumerar los archivos en un directorio dado, así como los archivos en sus subdirectorios sin mostrar solo los subdirectorios? Intenta resolver tu pregunta, no está muy claro.
slm

Respuestas:


92

También puedes hacer esto con solo du. Solo para estar seguro, estoy usando esta versión de du:

$ du --version
du (GNU coreutils) 8.5

El enfoque:

$ du -ah ..DIR.. | grep -v "/$" | sort -rh

Desglose de enfoque

El comando du -ah DIRproducirá una lista de todos los archivos y directorios en un directorio dado DIR. El -hproducirá tamaños legibles por humanos que prefiero. Si no los quiere, suelte ese interruptor. Estoy usando head -6solo para limitar la cantidad de salida.

$ du -ah ~/Downloads/ | head -6
4.4M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K    /home/saml/Downloads/kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M    /home/saml/Downloads/kodak_W820_wireless_frame
8.0K    /home/saml/Downloads/bugs.xls
604K    /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf

Suficientemente fácil de ordenar de menor a mayor:

$ du -ah ~/Downloads/ | sort -h | head -6
0   /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock

Invertirlo, de mayor a menor:

$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy

No me muestres el directorio, solo los archivos:

$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6 
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run

Si solo desea la lista de menor a mayor, pero los 6 archivos ofensivos principales puede revertir el interruptor de clasificación, soltar ( -r) y usar en tail -6lugar de head -6.

$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
1.5G    /home/saml/Downloads/digital_blasphemy
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
2.3G    /home/saml/Downloads/apps_archive
3.8G    /home/saml/Downloads/audible
3.8G    /home/saml/Downloads/audible/audio_books

14
La grep -v "/$"parte no parece estar haciendo lo que esperaba, ya que los directorios no tienen una barra inclinada añadida. ¿Alguien sabe cómo excluir directorios de los resultados?
Jan Warchoł

@JanekWarchol: ¿qué versión de coreutils estás usando?
slm

Estoy en 8.13. Pero de todos modos, el resultado en su respuesta tampoco tiene /s finales , por ejemplo, /home/saml/Downloads/audibleparece ser un directorio, pero no tiene una barra oblicua. Solo /home/saml/Downloads/tiene una barra oblicua, pero probablemente sea porque lo escribiste con una barra oblicua al especificar el argumento para inicial du.
Jan Warchoł

1
Esto también encuentra
directorios

1
Esto no solo enumera archivos, sino que también enumera directorios :(
Roman Gaufman

21

Si desea encontrar todos los archivos en el directorio actual y sus subdirectorios y enumerarlos según su tamaño (sin considerar su ruta), y suponiendo que ninguno de los nombres de archivo contenga caracteres de nueva línea, con GNU find, puede hacer esto:

find . -type f -printf "%s\t%p\n" | sort -n

Desde man findun sistema GNU:

   -printf format
          True; print format  on  the  standard  output,
          interpreting  `\'  escapes and `%' directives.
          Field widths and precisions can  be  specified
          as  with the `printf' C function.  Please note
          that many of the  fields  are  printed  as  %s
          rather  than  %d, and this may mean that flags
          don't work as you  might  expect.   This  also
          means  that  the `-' flag does work (it forces
          fields to be  left-aligned).   Unlike  -print,
          -printf  does  not add a newline at the end of
          the string.  The escapes and directives are:

          %p     File's name.
          %s     File's size in bytes.

De man sort:

   -n, --numeric-sort
          compare according to string numerical value

Desafortunadamente, no funciona en Mac, muestra: find: -printf: operador primario u operador desconocido
Roman Gaufman

@RomanGaufman sí, es por eso que la respuesta especifica GNU find. Si instala las herramientas GNU en su Mac, también funcionará allí.
terdon

11

Pruebe el siguiente comando:

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

Enumerará de manera recursiva los 20 archivos más grandes del directorio actual.

Nota: La opción -hpara sortno está disponible en OSX / BSD, por lo que debe instalar sortdesde coreutils(por ejemplo, a través de brew) y aplicar la ruta de bin local a PATH, por ejemplo

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

Alternativamente use:

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

Para el uso de directorios más grande du, por ejemplo:

du -ah . | sort -rh | head -20

o:

du -a . | sort -rn | head -20

3
Perfecto, esta es la primera solución que funciona en Mac y no muestra directorios :) - ¡Gracias!
Roman Gaufman

¿Cómo filtrar para mostrar solo el archivo con número de líneas> = X? (X = 0 por ejemplo)
Matriz

7

Esto buscará todos los archivos de forma recursiva y los ordenará por tamaño. Imprime todos los tamaños de archivo en kb y redondea hacia abajo para que pueda ver archivos de 0 KB, pero estaba lo suficientemente cerca para mis usos y funciona en OSX.

find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1


¡También trabajé en Ubuntu 14.04!
David Lam

Esto enumera directorios, no solo archivos :(
Roman Gaufman

@RomanGaufman: ¡gracias por los comentarios! de mis pruebas, find . -type fencuentra archivos ... funciona de manera recursiva, tienes razón, pero enumera todos los archivos que encuentra, no los directorios en sí mismos
Brad Parks

Xargs se usó en la década de 1980. Es una mala idea desde 1989 cuando David Korn introdujo execplus.
schily

5

Con zsh, encontrará el archivo más grande (en términos de tamaño aparente, como la columna de tamaño en la ls -lsalida, no el uso del disco) con:

ls -ld -- **/*(DOL[1])

Para los 6 más grandes:

ls -ld -- **/*(DOL[1,6])

Para ordenarlos por tamaño de archivo, puede usar lsla -Sopción 's . Algunas lsimplementaciones también tienen una -Uopción para lsno ordenar la lista (ya que aquí ya está ordenada por tamaño zsh).


3

Solución simple para Mac / Linux que omite directorios:

find . -type f -exec du -h {} \; | sort -h

2

El equivalente en BSDo OSXes

$ du -ah simpl | sort -dr | head -6

0

Esta es una necesidad increíblemente común por una variedad de razones (me gusta encontrar la copia de seguridad más reciente en un directorio), y es una tarea sorprendentemente simple.

Voy a proporcionar una solución de Linux que utiliza las utilidades find, xargs, stat, tail, awk y sort.

La mayoría de las personas han proporcionado algunas respuestas únicas, pero prefiero las mías porque maneja correctamente los nombres de archivo, y el caso de uso se puede cambiar fácilmente (modificar estadísticas y ordenar argumentos)

También proporcionaré una solución de Python que debería permitirle usar esta funcionalidad incluso en Windows

Solución de línea de comando de Linux

Recursivamente devuelve una lista completa de solo archivos de un directorio, ordenados por tamaño de archivo

find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n

Igual que antes, pero esta vez, devuelve el archivo más grande.

# Each utility is split on a new line to help 
# visualize the concept of transforming our data in a stream
find . -type f -print0 | 
xargs -0 -I{} stat -c '%s %n' {} | 
sort -n | 
tail -n 1 |
awk '{print $2}'

Mismo patrón exacto, pero ahora seleccione el archivo más nuevo en lugar del más grande

# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} | 
sort -n | tail -n 1 | awk '{print $2}'

Explicación:

  1. find: encuentra de forma recursiva todos los archivos del directorio actual y los imprime con un carácter nulo
  2. xargs: utilidad para ejecutar comandos usando argumentos proporcionados por la entrada estándar. Para cada línea de salida, queremos ejecutar la utilidad estadística en ese archivo
  3. stat: Stat es un comando impresionante que tiene tantos casos de uso. Estoy imprimiendo dos columnas, la primera columna es el tamaño del bloque (% s) y la segunda columna es el nombre del archivo (% n)
  4. sort: ordena los resultados con el interruptor numérico. Como el primer argumento es un entero, nuestros resultados se ordenarán correctamente
  5. tail: solo seleccione la última línea de salida (ya que la lista está ordenada, ¡este es el archivo más grande!)
  6. awk: Seleccione la segunda columna, que contiene el nombre del archivo, y es el archivo más grande en un directorio recursivo.

Solución Python

#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
    for filename in filenames:
        realpath = os.path.join(dirpath, filename)
        files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)

Este script tarda un poco más en explicarse, pero esencialmente si lo guarda como un script, buscará a través del primer argumento proporcionado en la línea de comando y devolverá el archivo más grande en ese directorio. El script no verifica errores, pero debería darle una idea de cómo abordar esto en Python, lo que le brinda una buena plataforma independiente para resolver este problema.



0

Pruebe el siguiente comando con la opción de ordenar para tener carpetas con tamaño en orden ascendente

du -sh * | sort -sh


-1

Algo que funciona en cualquier plataforma, excepto AIX y HP-UX es:

find . -ls | sort +6 | tail
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.