Encuentra los archivos o directorios más grandes

10

¿Qué comando imprimirá los tamaños de todos los archivos y directorios en el directorio tmp (incluidos los ocultos) y los ordenará por tamaños de mayor a menor en formato legible para humanos (por ejemplo, 2 GB)?

El resultado podría ser el siguiente:

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

Traté de usar los comandos lsy dupero no pude encontrar los interruptores correctos.

xralf
fuente

Respuestas:

7

Aquí hay una solución rápida, use du + sort. Prueba esto:

du -smc * | sort -n

Esto ignorará los archivos ocultos, pero esa es otra solución fácil:

du -smc .[^.] .??* * | sort -n

Esto puede causar advertencias sobre si uno o más de los patrones anteriores no coinciden con un archivo. El primer patrón .[^.]coincide con los dos nombres de archivo de caracteres que comienzan con. a excepción de ..., el segundo patrón, .??*coincide con las tres letras o más nombres de archivos que comienzan con. y * coincide con todos los archivos que no comienzan con. Para obtener una lista más sofisticada, como encontrar todos los archivos más grandes que X en todo un sistema de archivos, o mantener una lista de crecimiento del sistema de archivos, tengo un script de shell de bricolaje que he escrito y puedo compartir si está interesado.

pingüino359
fuente
Gracias. Me interesa tu guión si serás tan amable.
xralf
1
Úselo sort -nrsi quiere los valores más grandes en la parte superior.
LawrenceC
3

Para enumerar los archivos en cualquier lugar /tmp, ordenados por tamaño:

find /tmp -type f -exec du -k {} + | sort -k1n -k2

Para enumerar los archivos y los árboles de directorios inmediatamente debajo /tmp, ordenados por tamaño:

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

Para enumerar todos los archivos y árboles de directorios en cualquier lugar /tmp, ordenados por tamaño:

du -ak /tmp | sort -k1n -k2

(Un ejemplo para ilustrar la diferencia entre los tres comandos: si hay un archivo /tmp/dir/file, la primera lista de comandos /tmp/dir/file, la segunda lista /tmp/diry la tercera lista ambas).

Todos los comandos anteriores muestran tamaños en kilobytes. Si bien GNU du puede generar tamaños "legibles para humanos" (con multiplicadores k, M, G, etc.), ordenarlos es otra cuestión. Bastante reciente GNU coreutils (≥7.4) puede hacerlo: simplemente reemplace du -kcon du -hy sort -k1n -k2con sort -k1h -k2. De lo contrario, aquí hay un script awk crudo para convertir a tamaños con sufijo (redondeando hacia abajo); simplemente canalice la sortsalida de arriba en él.

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'
Gilles 'SO- deja de ser malvado'
fuente
Gracias. Esos comandos son útiles, pero solo me interesan los archivos y directorios directamente bajo tmp, no los archivos en subdirectorios
xralf
1
@xralf: luego use solo la segunda forma de dullamada.
Gilles 'SO- deja de ser malvado'
Se ve bien, pero el mejor resultado es con MB y GB como forcefsck publicado.
xralf
3

Estoy usando el siguiente alias para ello: alias ds='du -x --all --max-depth=1 . | sort -n'

Imprime tamaños de todos los archivos y subdirectorios de primer nivel del directorio actual.

rvs
fuente
Es una buena solución corta, pero solo imprime directorios.
xralf
Oh, lo siento, tienes razón. Nunca me he enfrentado a este problema con los archivos. Sin embargo, he encontrado cómo hacer que funcione con archivos: usando --todos swicth.
rvs
Gran solución correcta. penguin359 tiene un poco mejor porque muestra los tamaños en MB. Lo mejor sería la solución de forcefsck pero su solución omite directorios con espacios.
xralf
1

Con la versión actual de gnu sort (y tomando prestado el patrón de archivo @ penguin359)

cd /tmp; du -sShc .[^.] .??* * | sort -h

Con una versión anterior de tipo

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

EDITAR: parámetro -S agregado dupara no incluir subdirectorios.

forcefsck
fuente
Quería más bien espacio en disco utilizado por archivos y directorios (tamaño total de datos dentro) directamente bajo tmp (no subdirectorios). Mi comando de clasificación no tiene la opción -h.
xralf
No estoy 100% seguro de lo que quiere decir, ya que ya había aceptado una respuesta con la misma selección de patrón de archivo. Edité mi publicación para no incluir subdirecciones. Si desea el tamaño aparente y no el espacio de disco real utilizado, puede agregar --apparent-sizea du parámetros.
forcefsck
Ahora funciona bien. Solo tengo que buscar GB y luego MB, pero no es un problema.
xralf
Tenía las letras de la unidad en el orden incorrecto, ahora arregladas. Si desea que el orden sea de grande a pequeño, cambie el orden de las letras de unidad y agregue -r para ordenar.
forcefsck
Me di cuenta, olvidé imprimir el tamaño del directorio (sin prefijo)
Xralf
0

ACTUALIZACIÓN: he descartado el script anterior. Aquí hay una nueva versión, usando duy awk (la anterior usada treey sed)

Esta es la salida de: dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

Aquí está el guión

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#
Peter.O
fuente
Cuando dice tamaños de todos los archivos y directorios , ¿se refiere al espacio que ocupa cada elemento en el disco (por ejemplo, en mi sistema de archivos Ubuntu ext4 , un directorio vacío ocupa 4k de espacio en disco y un archivo más pequeño que 4k ocupa 4k La porción de asignación mínima es 4k) ... o quiere decir la cantidad de datos en cada archivo, por ejemplo, 100 (bytes) ... Y para los directorios, ¿desea saber el total de datos de archivo en ese directorio? Si desea el tamaño de los datos dentro de los archivos, luego lo treehace. si desea utilizar el espacio en disco, entonces duhace eso ... ( treeno totaliza un directorio)
Peter.O
'du' es la mejor opción ... acabo de notar man duque también puede informar el "tamaño aparente del archivo" ... The apparent size of a file is the number of bytes reported by wc -c 'en archivos normales, o más generalmente, ls -l --block-size=1' or stat --format =% s '. Por ejemplo, un archivo que contiene la palabrazoo' with no newline would, of course, have an apparent size of 3.
Peter
Quería más bien el espacio en disco utilizado por los archivos y directorios (tamaño total de datos dentro) directamente bajo tmp (no subdirectorios)
xralf
Lo siento, no estoy en la etapa de scripting de shell. Aún podría entenderlo, así que dejo que otros usuarios decidan qué tan buena es la respuesta. Gracias por tu trabajo. Lo estudiaré cuando esté mejor.
xralf
0
find /tmp -exec du {} + | sort -nr | less 

muestra los archivos más grandes primero, por lo que puede qusarlos tan pronto como haya visto lo suficiente.

usuario desconocido
fuente