Come trovare il file più grande in una directory e nelle sue sottodirectory?


102

Stiamo appena iniziando una classe UNIX e stiamo imparando una varietà di comandi Bash. Il nostro compito implica l'esecuzione di vari comandi su una directory che ha anche un numero di cartelle sotto di essa.

So come elencare e contare tutti i file normali dalla cartella principale utilizzando:

find . -type l | wc -l

Ma mi piacerebbe sapere dove andare da lì per trovare il file più grande dell'intera directory. Ho visto qualcosa riguardo a un ducomando, ma non l'abbiamo imparato, quindi nel repertorio di cose che abbiamo imparato presumo che dobbiamo collegarlo in qualche modo al ls -tcomando.

E perdonami se il mio "gergo" non è corretto, mi ci sto ancora abituando!


2
Se conosci un comando, ma non sei sicuro di come usarlo, prova a digitare manseguito dal comando che ti interessa. Su apparirà una bella voce manuale per quel comando (premi qper tornare alla riga di comando).
Dunes

Risposte:


126

Citazione da questo link-

Se si desidera trovare e stampare i primi 10 nomi di file più grandi (non directory) in una determinata directory e nelle sue sottodirectory

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

Per restringere la ricerca alla directory attuale usa "-maxdepth 1" con find.

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

E per stampare i primi 10 "file e directory" più grandi:

$ du -a . | sort -nr | head

** Usa "head -n X" invece dell'unica "head" sopra per stampare i primi X file più grandi (in tutti gli esempi precedenti)


1
Perché "du -a. | Sort -nr | head" restituisce il doppio del numero di KB rispetto alla dimensione effettiva del file?
xxjjnn

6
Ah, devi aggiungere l'opzione "k" o mostra multipli di 512 byte anziché di 1024. du -ak
xxjjnn

2
per il primo, come si ottiene la dimensione in un formato leggibile dall'uomo?
Bluz

@Bluz mi piacerebbe provare a sostituire '%s %p\n'con '%p\n'e aggiungendo |xargs ls -lhalla fine
Duncan Simpson X

6
La prima soluzione non ha funzionato su OS X per me, così ho finito per usare un trucco veloce per filtrare le directory dalla terza soluzione: du -am . | sort -nr | grep '\..*\.' | head. Serve mper visualizzare la dimensione del file in megabyte e serve grepper mostrare le linee con almeno due punti, il primo è nel ./percorso, il secondo nell'estensione del file, ad es .mov.
psmith

63

Per trovare i primi 25 file nella directory corrente e nelle sue sottodirectory:

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

Questo produrrà i primi 25 file ordinandoli in base alla dimensione dei file tramite il comando piped "sort -nr -k5".

Lo stesso ma con dimensioni di file leggibili dall'uomo:

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


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

uscite

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

Se vuoi solo il nome del file:

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

Questo evita l'uso awke ti consente di usare qualsiasi flag tu voglia ls.

Avvertimento . Poiché xargscerca di evitare di creare righe di comando troppo lunghe, potrebbe non riuscire se lo esegui su una directory con molti file perché lsfinisce per essere eseguito più di una volta. Non è un problema insormontabile (puoi raccogliere l' head -n 1output da ogni lsinvocazione ed eseguire di ls -Snuovo, ripetendo il ciclo finché non hai un singolo file), ma in qualche modo rovina questo approccio.


mi dispiace xargs, ti ho trascurato +1
Steve

2
per gestire i nomi di file con spazi, utilizzarefind . -type f -print0 | xargs -0 ls -lS | head -n 1
rymo

Questo trova i file più grandi solo nel primo batch xargsè stato eseguito. Per risolvere il problema aggiungere l'ordinamento: find . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10. Ha lavorato su OSX per me.
psmith

10

Non è disponibile un semplice comando per trovare i file / directory più grandi su un filesystem Linux / UNIX / BSD. Tuttavia, la combinazione dei seguenti tre comandi (utilizzando pipe) è possibile trovare facilmente l'elenco dei file più grandi:

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

Se vuoi un output più leggibile dall'uomo prova:

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

Dove,

  • Var è la directory in cui vuoi cercare
  • opzione du comando -h: visualizza le dimensioni in un formato leggibile dall'uomo (ad esempio, 1K, 234M, 2G).
  • opzione du comando -s: mostra solo un totale per ogni argomento (sommario).
  • opzione du comando -x: salta le directory su diversi file system.
  • comando di ordinamento -r opzione: inverte il risultato dei confronti.
  • comando di ordinamento -h opzione: confronta i numeri leggibili dall'uomo. Questa è solo un'opzione specifica per l'ordinamento GNU.
  • comando head -10 OPPURE opzione -n ​​10: mostra le prime 10 righe.

Mi piace di più il secondo comando, ma su osx non è installata l'opzione -h per la versione di ordinamento. Dovrebbe essere per mac: du -hsx * | sort -rn | testa -10
Yann VR

1
Amare quel secondo comando! Il migliore di tutti quelli che ho provato, lo conserverò per dopo.
CodeMouse92

Spiega chiaramente il comando in dettaglio +1
Harish

8

Questo elenca i file in modo ricorsivo se sono file normali, ordina in base al settimo campo (che è la dimensione nel mio findoutput; controlla il tuo) e mostra solo il primo file.

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

La prima opzione findè il percorso iniziale per la ricerca ricorsiva. Un tipo di fricerca di file normali. Nota che se provi ad analizzarlo come un nome di file, potresti non riuscire se il nome di file contiene spazi, nuove righe o altri caratteri speciali. Le opzioni possono sortvariare anche in base al sistema operativo. Sto usando FreeBSD.

Una soluzione "migliore" ma più complessa e più pesante sarebbe quella di findattraversare le directory, ma forse usarla statper ottenere i dettagli sul file, quindi forse usarla awkper trovare la dimensione massima. Nota che l'output di statdipende anche dal tuo sistema operativo.


1
Cosa intende fare l' +7arg? Sulla mia macchina sort si lamenta semplicemente di non riuscire a trovare un file chiamato +7.
Dunes

@Dunes - Come ho detto, controlla la pagina man sortsul tuo sistema. Al momento sto usando OS X 10.4, dove l'utilizzo deriva dal tipo di FreeBSD : sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]... Nota il +POS [-POS2]. Funziona anche nelle versioni correnti di FreeBSD.
ghoti

2
Sembra che tu abbia un programma di smistamento diverso da me. Questa è la pagina di manuale per il mio programma di ordinamento - linux.die.net/man/1/sort Perché funzioni sulla mia macchina dovresti usare esplicitamente l' -kargomento ad es. sort -k 7. modifica: con OSX 10.5 la pagina man per l'ordinamento sembra essere cambiata nella versione che ho.
Dunes

1
@Dunes - È tutto ordinamento GNU, ma versioni diverse. La [+POS1] [-POS2]notazione è solo più vecchia. Per quanto ne so, questa notazione è ancora supportata dal moderno ordinamento GNU, anche se ora che guardo, sembra essere stato eliminato dalla pagina man di ordinamento dopo la versione 5.1. Puoi vederlo nella pagina man per l' ordinamento per FreeBSD 4.11 . Immagino di non aver letto la pagina man di sort da prima del rilascio di FreeBSD 5.0!
ghoti

Inoltre, nota che +POS1conta i parametri di ordinamento da zero, mentre -k POS1conta da uno.
ghoti

6

Questo troverà il file o la cartella più grande nella tua attuale directory di lavoro:

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

Per trovare il file più grande in tutte le sottodirectory:

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

Penso che il comportamento predefinito di ls sia elencare i file in colonne (cioè più voci per riga), quindi il primo non trova esattamente solo il file più grande. Per quanto riguarda il tuo secondo comando, ha trovato solo il file più grande nella directory data e non le sue sottodirectory.
Dunes

@Dunes: hai ragione, il primo comando potrebbe trovare le directory, ma non a causa del comportamento predefinito di ls. Durante i miei test, il -Sflag elencherà un file per riga. Ho corretto il secondo comando. Si spera che ora sia completamente a prova. Grazie.
Steve,

4

Su Solaris utilizzo:

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

o

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

perché qualsiasi altra cosa pubblicata qui non ha funzionato. Questo troverà il file più grande in $PWDe sottodirectory.


2

Prova il seguente one-liner (mostra i primi 20 file più grandi):

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

o (dimensioni leggibili dall'uomo):

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

Funziona bene sotto Linux / BSD / OSX rispetto ad altre risposte, poiché l' -printfopzione find non esiste su OSX / BSD e statha parametri diversi a seconda del sistema operativo. Tuttavia il secondo comando di lavorare su OSX / BSD correttamente (come sortnon ha -h), installare sortda coreutilso Rimuovi -hda lse utilizzare sort -nrinvece.

Quindi questi alias sono utili da avere nei tuoi file rc :

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

Questo mostra solo il nome del file senza il percorso, quindi non aiuta davvero a trovare effettivamente il file più grande.
psmith

Per me in cima ho file davvero più grandi, ma alla fine questo non mi dà file corretti
Borislav Markov

2

Prova il seguente 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 

Questo stamperà il nome e la dimensione del file più grandi e più di 500M. Puoi spostare il if($1 > 500000), e stamperà il file più grande nella directory.


1

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

o

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


0

Questo script semplifica la ricerca dei file più grandi per ulteriori azioni. Lo tengo nella mia directory ~ / bin e metto ~ / bin nel mio $ 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

Questo è un modo molto più semplice per farlo:

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

E otterrai questo: 8445 examples.desktop


Cosa 1***dovrebbe fare alla fine? Ottengo un errore "nessuna corrispondenza trovata" per quell'argomento.
user4815162342

0

Soluzione Linux: ad esempio, si desidera visualizzare l'elenco di tutti i file / cartelle della directory home (/) in base alla dimensione del file / cartella ( ordine discendente ).

sudo du -xm / | sort -rn | Di Più


0

Per elencare il file più grande in una cartella

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

L'output di ls -shè una vista dimensionata se hcomprensibile per le persone del numero di dimensioni del file.

Potresti usare ls -shS /pathFolder | head -n 1. Il più grande Sda lsgià ordina l'elenco dai file più grandi a quelli più piccoli, ma il primo risultato è la somma di tutti i file in quella cartella. Quindi, se vuoi elencare solo il file più grande, un file, devi head -n 2controllare il "risultato della seconda riga" o utilizzare il primo esempio con ls sort head.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.