¿Cómo encontrar el archivo más grande en un directorio y sus subdirectorios?


102

Recién estamos comenzando una clase de UNIX y estamos aprendiendo una variedad de comandos Bash. Nuestra tarea implica ejecutar varios comandos en un directorio que también tiene varias carpetas debajo.

Sé cómo enumerar y contar todos los archivos regulares de la carpeta raíz usando:

find . -type l | wc -l

Pero me gustaría saber a dónde ir desde allí para encontrar el archivo más grande en todo el directorio. He visto dualgunas cosas con respecto a un comando, pero no lo hemos aprendido, así que en el repertorio de cosas que hemos aprendido, supongo que necesitamos conectarlo de alguna manera al ls -tcomando.

Y perdóname si mi 'jerga' no es correcta, ¡todavía me estoy acostumbrando!


2
Si conoce un comando, pero no está seguro de cómo usarlo, intente escribir manseguido del comando que le interesa. Aparecerá una buena entrada manual para ese comando (presione qpara volver a la línea de comandos).
Dunes

Respuestas:


126

Cita de este enlace

Si desea buscar e imprimir los 10 nombres de archivos más grandes (no directorios) en un directorio en particular y sus subdirectorios

$ find . -printf '%s %p\n'|sort -nr|head

Para restringir la búsqueda al directorio actual, use "-maxdepth 1" con find.

$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head

Y para imprimir los 10 "archivos y directorios" más grandes:

$ du -a . | sort -nr | head

** Utilice "head -n X" en lugar del único "head" de arriba para imprimir los X archivos más grandes (en todos los ejemplos anteriores)


1
¿Por qué "du -a. | Sort -nr | head" devuelve el doble de KB que el tamaño real del archivo?
xxjjnn

6
Ah, debe agregar la opción 'k' o muestra múltiplos de 512 bytes en lugar de 1024. du -ak
xxjjnn

2
para el primero, ¿cómo se obtiene el tamaño en un formato legible por humanos?
Bluz

@Bluz que iba a tratar la sustitución '%s %p\n'con '%p\n'y añadiendo |xargs ls -lhal final
Duncan Simpson X

6
La primera solución no funciona en OS X para mí, así que acabé utilizando un truco rápido para filtrar los directorios de la tercera solución: du -am . | sort -nr | grep '\..*\.' | head. El mes el tamaño de archivo de pantalla en megabytes y se utiliza greppara líneas muestran con al menos dos puntos, el primero es en el ./en el camino, el segundo es en la extensión de archivo, por ejemplo .mov.
psmith

63

Para encontrar los 25 archivos principales en el directorio actual y sus subdirectorios:

find . -type f -exec ls -al {} \; | sort -nr -k5 | head -n 25

Esto generará los 25 archivos principales ordenándolos según el tamaño de los archivos mediante el comando canalizado "sort -nr -k5".

Lo mismo pero con tamaños de archivo legibles por humanos:

find . -type f -exec ls -alh {} \; | sort -hr -k5 | head -n 25


10
find . -type f | xargs ls -lS | head -n 1

salidas

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

Si solo quiere el nombre del archivo:

find . -type f | xargs ls -1S | head -n 1

Esto evita usar awky le permite usar las banderas que desee ls.

Advertencia . Debido a que xargsintenta evitar construir líneas de comando demasiado largas, esto podría fallar si lo ejecuta en un directorio con muchos archivos porque lstermina ejecutándose más de una vez. No es un problema insuperable (puede recopilar la head -n 1salida de cada lsinvocación y ejecutar ls -Snuevamente, repitiendo hasta que tenga un solo archivo), pero estropea un poco este enfoque.


Lo siento xargs, te he descuidado +1
Steve

2
para manejar nombres de archivo con espacios, usefind . -type f -print0 | xargs -0 ls -lS | head -n 1
rymo

Esto encuentra los archivos más grandes en solo el primer lote que se xargsha ejecutado. Para solucionarlo añadir clasificar: find . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10. Trabajó en OSX para mí.
psmith

10

No existe un comando simple disponible para encontrar los archivos / directorios más grandes en un sistema de archivos Linux / UNIX / BSD. Sin embargo, con la combinación de los siguientes tres comandos (usando tuberías) puede encontrar fácilmente la lista de archivos más grandes:

# du -a /var | sort -n -r | head -n 10

Si desea una salida más legible por humanos, intente:

$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10

Dónde,

  • Var es el directorio que desea buscar
  • Opción du command -h: tamaños de pantalla en formato legible por humanos (por ejemplo, 1K, 234M, 2G).
  • Opción du command -s: muestra solo un total para cada argumento (resumen).
  • du command -x opción: omitir directorios en diferentes sistemas de archivos.
  • comando sort opción -r: invertir el resultado de las comparaciones.
  • comando sort opción -h: comparar números legibles por humanos. Esta es solo una opción específica de clasificación de GNU.
  • comando head -10 O -n 10 opción: muestra las primeras 10 líneas.

Me gusta más el segundo comando, pero en osx, no hay opción -h para ordenar la versión instalada. Debería ser para mac: du -hsx * | sort -rn | head -10
Yann VR

1
¡Amar ese segundo comando! Lo mejor de todos los que he probado: lo guardaré para más tarde.
CodeMouse92

Explica claramente el comando en detalle +1
Harish

8

Esto enumera los archivos de forma recursiva si son archivos normales, los ordena por el séptimo campo (que es el tamaño en mi findsalida; verifique el suyo) y muestra solo el primer archivo.

find . -type f -ls | sort +7 | head -1

La primera opción findes la ruta de inicio para la búsqueda recursiva. Un tipo de fbúsquedas de archivos normales. Tenga en cuenta que si intenta analizar esto como un nombre de archivo, puede fallar si el nombre de archivo contiene espacios, líneas nuevas u otros caracteres especiales. Las opciones sorttambién varían según el sistema operativo. Estoy usando FreeBSD.

Una solución "mejor" pero más compleja y más pesada sería findatravesar los directorios, pero quizás usar statpara obtener los detalles sobre el archivo, luego quizás usar awkpara encontrar el tamaño más grande. Tenga en cuenta que la salida de stattambién depende de su sistema operativo.


1
¿Qué se +7supone que debe hacer el arg? En mi máquina, sort se queja de que no puede encontrar un archivo llamado +7.
Dunas

@Dunes: como dije, consulte la página de manual de sortsu sistema. Estoy usando OS X 10.4 en este momento, donde el uso se deriva del tipo de FreeBSD : sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]... Note el +POS [-POS2]. Esto también funciona en las versiones actuales de FreeBSD.
ghoti

2
Parece que tienes un programa diferente al mío. Esta es la página del manual de mi programa de ordenación: linux.die.net/man/1/sort Para que esto funcione en mi máquina, necesitaría usar explícitamente el -kargumento, por ejemplo. sort -k 7. editar: por OSX 10.5, la página de manual para ordenar parece haber cambiado a la versión que tengo.
Dunes

1
@Dunes: es todo tipo GNU, pero diferentes versiones. La [+POS1] [-POS2]notación es más antigua. Por lo que puedo decir, esta notación todavía es compatible con la clasificación GNU moderna, aunque ahora que miro, parece que se ha eliminado de la página del manual de clasificación después de la versión 5.1. Puede verlo en la página de manual de sort para FreeBSD 4.11 . ¡Supongo que no he leído la página de manual de sort desde antes del lanzamiento de FreeBSD 5.0!
ghoti

Además, tenga en +POS1cuenta que los recuentos ordenan los parámetros desde cero, mientras que los -k POS1recuentos desde uno.
ghoti

6

Esto encontrará el archivo o carpeta más grande en su directorio de trabajo actual:

ls -S /path/to/folder | head -1

Para encontrar el archivo más grande en todos los subdirectorios:

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'

Creo que el comportamiento predeterminado de ls es enumerar archivos en columnas (es decir, varias entradas por línea), por lo que el primero no encuentra exactamente el archivo más grande. Con respecto a su segundo comando, solo encontró el archivo más grande en el directorio dado y no sus subdirectorios.
Dunes

@Dunes: Tienes razón, el primer comando podría encontrar directorios, pero no debido al comportamiento predeterminado de ls. En mis pruebas, la -Sbandera mostrará un archivo por línea. He corregido el segundo comando. Con suerte, ahora es completamente a prueba. Gracias.
Steve

4

En Solaris uso:

find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

o

find . -type f -ls | sort -nrk7 | head -1 #unformatted

porque cualquier otra cosa publicada aquí no funcionó. Esto encontrará el archivo más grande en $PWDy subdirectorios.


2

Pruebe el siguiente resumen (muestre los 20 archivos más grandes):

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

o (tamaños legibles por humanos):

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

Funciona bien en Linux / BSD / OSX en comparación con otras respuestas, ya que la -printfopción de búsqueda no existe en OSX / BSD y stattiene diferentes parámetros según el sistema operativo. Sin embargo, el segundo comando al trabajo en OSX / BSD correctamente (como sortno tiene -h), instalar sortdesde coreutilso eliminar -hdesde lsy utilizar sort -nren su lugar.

Entonces, estos alias son útiles para tener en sus archivos rc :

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'

Esto solo muestra el nombre del archivo sin la ruta, por lo que realmente no ayuda a encontrar el archivo más grande.
psmith

Para mí, en la parte superior, tengo archivos realmente más grandes, pero al final esto no me da los archivos correctos
Borislav Markov

2

Intente seguir el comando:

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1 

Esto imprimirá el nombre y tamaño de archivo más grande y más de 500M. Puede mover el if($1 > 500000), e imprimirá el archivo más grande del directorio.


1

du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1

o

du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'


0

Este script simplifica la búsqueda de archivos más grandes para acciones posteriores. Lo guardo en mi directorio ~ / bin y pongo ~ / bin en mi $ PATH.

#!/usr/bin/env bash
# scriptname: above
# author: Jonathan D. Lettvin, 201401220235

# This finds files of size >= $1 (format ${count}[K|M|G|T], default 10G)
# using a reliable version-independent bash hash to relax find's -size syntax.
# Specifying size using 'T' for Terabytes is supported.
# Output size has units (K|M|G|T) in the left hand output column.

# Example:
#   ubuntu12.04$ above 1T
#   128T /proc/core

# http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
# Inspiration for hasch: thanks Adam Katz, Oct 18 2012 00:39
function hasch() { local hasch=`echo "$1" | cksum`; echo "${hasch//[!0-9]}"; }
function usage() { echo "Usage: $0 [{count}{k|K|m|M|g|G|t|T}"; exit 1; }
function arg1() {
    # Translate single arg (if present) into format usable by find.
    count=10; units=G;  # Default find -size argument to 10G.
    size=${count}${units}
    if [ -n "$1" ]; then
        for P in TT tT GG gG MM mM Kk kk; do xlat[`hasch ${P:0:1}`]="${P:1:1}"; done
        units=${xlat[`hasch ${1:(-1)}`]}; count=${1:0:(-1)}
        test -n "$units" || usage
        test -x $(echo "$count" | sed s/[0-9]//g) || usage
        if [ "$units" == "T" ]; then units="G"; let count=$count*1024; fi
        size=${count}${units}
    fi
}
function main() {
    sudo \
        find / -type f -size +$size -exec ls -lh {} \; 2>/dev/null | \
        awk '{ N=$5; fn=$9; for(i=10;i<=NF;i++){fn=fn" "$i};print N " " fn }'
}

arg1 $1
main $size

0

Esa es una forma bastante más sencilla de hacerlo:

ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***

Y obtendrás esto: 8445 examples.desktop


¿Qué se 1***supone que debe hacer al final? Recibo un error de "no se encontraron coincidencias" para ese argumento.
user4815162342

0

Solución Linux: Por ejemplo, desea ver la lista de todos los archivos / carpetas de su directorio de inicio (/) según el tamaño del archivo / carpeta ( orden descendente ).

sudo du -xm / | sort -rn | más


0

Para enumerar el archivo más grande en una carpeta

ls -sh /pathFolder | sort -rh | head -n 1

El resultado de ls -shes una vista de tamaño sy hcomprensible por humanos del número de tamaño de archivo.

Podrías usar ls -shS /pathFolder | head -n 1. Cuanto más grande sea Sdesde lsya pedir la lista de los archivos más grandes a las más pequeñas, pero el primer resultado de su la suma de todos los archivos de esa carpeta. Entonces, si solo desea enumerar el archivo más grande, un archivo, debe head -n 2verificar el "resultado de la segunda línea" o usar el primer ejemplo con ls sort head.


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.