Come elencare tutti i file ordinati per dimensione


241

Vorrei elencare tutti i file in ordine da grande a piccolo e i file potrebbero essere presenti ovunque in una determinata cartella.



5
da man ls:-S sort by file size
ctrl-alt-delor

Intendi "i file si trovano in questa directory" o "i file possono trovarsi in qualsiasi sottodirectory".
ctrl-alt-delor

Se sei in grado / vuoi usare uno strumento GUI, dai un'occhiata a QDirStat , precedentemente KDirStat .
RhinoDevel,

Risposte:


290

Usa semplicemente qualcosa come:

ls -lS /path/to/folder/

Capitale S .

Questo ordinerà i file per dimensione.

Vedi anche:

man ls

-S     sort by file size

Se vuoi ordinare in ordine inverso , aggiungi semplicemente -rswitch.

Aggiornare:

Per escludere le directory (e purché nessuno dei nomi di file o destinazioni symlink contenga caratteri di nuova riga):

ls -lS | grep -v '^d' 

Aggiornamento 2:

Vedo ora come mostra ancora collegamenti simbolici, che potrebbero essere cartelle. I collegamenti simbolici iniziano sempre con una lettera l, come nel collegamento.

Modificare il comando in filtro per a -. Questo dovrebbe lasciare solo file regolari:

ls -lS | grep '^-'

Sul mio sistema questo mostra solo file regolari.

aggiornamento 3:

Per aggiungere la ricorsione, lascerei l'ordinamento delle righe al sortcomando e gli direi di usare la quinta colonna per ordinare.

ls -lR | grep '^-' | sort -k 5 -rn

-rnsignifica inverso e numerico per ottenere i file più grandi in alto. L'aspetto negativo di questo comando è che non mostra il percorso completo dei file.

Se hai bisogno del percorso completo dei file, usa qualcosa del genere:

find . -type f  -exec du -h {} + | sort -r -h

Il findcomando troverà in modo ricorsivo tutti i file in tutte le sottodirectory di .e chiamerà du -h(ovvero utilizzo del disco - umanamente leggibile ) e quindi riordinerà l'output. Se il tuo find/ sortnon supporta -h, sostituire con du -ke sort -rn. Si noti che le dimensioni e l' utilizzo del disco non sono la stessa cosa.


5
dufornisce l'utilizzo del disco che è diverso dalla dimensione del file. Con (GNU) du -h, l'ordinamento numerico non funzionerà ( -hper ordinare è necessaria l' opzione GNU). xargs prevede un elenco di parole eventualmente citate come input, quindi non funzionerà se i nomi dei file contengono spazi vuoti o caratteri tra virgolette.
Stéphane Chazelas,

1
Vedo che -S ha un ordine di dimensioni decrescente, che dire di un ordine crescente?
Demongolem

3
A seguito di @ StéphaneChazelas, questo funziona per me: find . -type f -print0 | xargs -0 du -h | sort -rh. Se si vuole solo dire che i più grandi 30 file: find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30.
user7543

Ciao! Potresti spiegare la + |sintassi per favore + | sort -r -h?
Victor


25

Puoi usare qualcosa come trovare e ordinare.

find . -type f -ls | sort -r -n -k7

(l' -lsopzione non è standard ma si trova in molte implementazioni find, non solo in GNU. In GNU find e in altre, mostra qualcosa di simile a ls -licon alcune eccezioni, ad esempio i file con ACL non sono contrassegnati con un +)

Se i nomi dei file possono contenere caratteri di nuova riga, con GNU find e GNU sort:

find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'

Ciò presuppone che la colonna "gruppo" (da -ls) non contenga spazi (da cui il parametro -k 7), ma non è sempre necessariamente così.
Kolistivra,

1
perché non semplicemente trovare ... -print0 | ordina -zk7rn0?
Andre de Miranda,

10

Con zsh e GNU ls:

ls -ldU -- **/*(.OL)

Dove si (.OL)trova un qualificatore glob , .per selezionare solo i file regolari , OLper invertire l'ordine per lunghezza (dimensione del file, o per ordine crescente, Oper ordine decrescente).

(nota che le versioni precedenti di zsh avevano problemi con file di dimensioni superiori a 2 ^ 32).

Alcuni sistemi operativi hanno un limite alla dimensione dell'elenco degli argomenti passati a un comando. In questi casi, avresti bisogno di:

autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU

Se vuoi solo l'elenco dei file e non l'output dettagliato, fai semplicemente:

print -rl -- **/*(.OL)

Se vuoi includere file nascosti (il cui nome inizia con un punto, tranne .e ..) e cercare anche nelle directory nascoste, aggiungi il Dqualificatore globbing:

print -rl -- **/*(.DOL)

cosa fa .OL? Fa parte del comando?
alpha_989,

@ alpha_989, vedi modifica
Stéphane Chazelas,

Grazie per la spiegazione, Stephane .. Tuttavia, per qualche motivo .. il comando non funziona sulla mia workstation .. Sto usando ls (GNU coreutils) 8.25e zsh 5.1.1 (x86_64-ubuntu-linux-gnu). Funziona solo con alcune versioni di lse zsh?
alpha_989,

@ alpha_989, in che modo non funziona per te? Funziona per me con quelle stesse versioni e non c'è nulla in quel codice che non avrebbe funzionato nelle versioni di almeno 15 anni fa.
Stéphane Chazelas,

9

Elenco dei file per dimensione crescente sarebbe:

ls -lSr

Le opzioni sono:

  • l: lungo, mostra l'utente dettagliato, il gruppo, altri attributi, la data, ecc.
  • S: elenco degli ordini per dimensione (decrescente di default)
  • r: inverte l'ordine di quotazione

Ti dispiacerebbe spiegare le opzioni per migliorare la qualità della risposta?
Rui F Ribeiro,

6

Dire che "i file potrebbero essere presenti ovunque in una determinata cartella" implica che si desidera discendere ricorsivamente tutte le directory (cartelle) all'interno della directory iniziale (cartella). Questo è ciò che findsi intende fare:

find . -type f -exec ls -lSd {} +

Questo "trova" tutti i file nella directory di lavoro corrente ( .). Per ogni file trovato, lsviene eseguito un processo per ordinare gli oggetti trovati in ordine di dimensione. Il +terminatore a -execcausa il passaggio di più argomenti come elenco a ls. A meno che la tua directory (cartella) contenga un numero molto grande di file, dovresti avere un elenco (e quindi un processo biforcato), che porta al risultato che desideri.


1
questo è bello in quanto ti permette di usare il modificatore -h su ls per mostrare belle dimensioni di file
shmish111

4

Elenco file visualizzato in ordine inverso: ls -lSrh

Per ordine crescente: ls -lSh


1
+1 per l'utilizzo del flag -h per output a misura d'uomo.
computingfreak

2

Ho scritto qualcosa fino a questo punto qualche tempo fa. Potresti passare un argomento per specificare quanti file elencare, o semplicemente digitare big, nel qual caso ottieni 10.

big () { 
    NUM_FILES=10;
    if [ $1 ]; then
        NUM_FILES=$1;
    fi;
    du | sort -nr | head -n $NUM_FILES
}

2

Prova questi, funziona bene per me.

$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10

# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'

Risposta non perfetta però, ma funziona in una certa misura

$ ls -lS |grep  '^-' | head -n 6 

1
awk funziona bene se i nomi dei file non contengono spazi.
Eir Nym,

si .. usa 'sed' e sostituisci lo spazio con il trattino basso? se questo aiuta
Sand1512

No, io uso sedper tagliare l'output
Eir Nym,

1

Aggiungendo alla risposta di Delh e al commento di Stéphane Chazelas ...

find -print0combinato con xargs -0aggiunge il supporto per spazi / spazi / whatnots.

du -h | sort -rn non si ordina correttamente tra multipli di byte diversi, ad es. 1.1M mostrerà dopo 128K, il che è sbagliato.

sort -rh (--human-numeric-sort) se ne occupa, ma funziona solo sulla versione di GNU.

I comandi seguenti forniranno l'output desiderato.

Leggibile dall'uomo, su GNU / Linux:

find . -type f -print0 | xargs -0 du -h | sort -rh

In unità di kilobyte, su BSD / OSX / altri:

find . -type f -print0 | xargs -0 du -k | sort -rn

Per BSD / OSX, consultare anche https://unix.stackexchange.com/a/188375/82895 .


1

Come variante della domanda originale, se si desidera visualizzare la dimensione cumulativa dei file nelle sottodirectory:

#!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr

Le dimensioni verranno visualizzate in Megabyte ( min du -sm). Altri valori accettati da dusono -kper i kilobyte, -gper i gigabyte. L'uso -hper la visualizzazione leggibile dall'uomo non è possibile perché interromperà l'ordinamento.

Ecco una versione che utilizza sedper aggiungere il Mper megabyte:

find ${1:-.} -maxdepth 1  -type d  -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/\1M/g'

La directory da visualizzare viene impostata tramite la ${1:-.}quale verrà utilizzato il primo argomento della riga di comando, se fornito, oppure verrà utilizzata la directory corrente se chiamata senza argomenti.

NOTA: questo può richiedere molto tempo con molti file. L'opzione -type delencherà solo le sottodirectory ed escluderà i file nella cartella corrente; se vuoi vedere anche i file nella cartella corrente, rimuovili.

Nota: potresti voler usare ncduinvece quello che è disponibile nella maggior parte dei repository linux (su ubuntu / debian apt install ncdu) e su osx ( brew install ncdu).

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.