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
.
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
.
Respuestas:
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
El comando du -ah DIR
producirá una lista de todos los archivos y directorios en un directorio dado DIR
. El -h
producirá tamaños legibles por humanos que prefiero. Si no los quiere, suelte ese interruptor. Estoy usando head -6
solo 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 -6
lugar 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
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?
/
s finales , por ejemplo, /home/saml/Downloads/audible
parece 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
.
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 find
un 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
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 -h
para sort
no está disponible en OSX / BSD, por lo que debe instalar sort
desde 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
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
find . -type f
encuentra archivos ... funciona de manera recursiva, tienes razón, pero enumera todos los archivos que encuentra, no los directorios en sí mismos
Con zsh
, encontrará el archivo más grande (en términos de tamaño aparente, como la columna de tamaño en la ls -l
salida, 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 ls
la -S
opción 's . Algunas ls
implementaciones también tienen una -U
opción para ls
no ordenar la lista (ya que aquí ya está ordenada por tamaño zsh
).
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
find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n
# 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}'
# (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:
#!/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.
Variante de esta respuesta de una pregunta similar
find . -type f -exec du -ah {} + | sort -rh | more
Pruebe el siguiente comando con la opción de ordenar para tener carpetas con tamaño en orden ascendente
du -sh * | sort -sh