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.