Vorrei elencare tutti i file in ordine da grande a piccolo e i file potrebbero essere presenti ovunque in una determinata cartella.
man ls
:-S sort by file size
Vorrei elencare tutti i file in ordine da grande a piccolo e i file potrebbero essere presenti ovunque in una determinata cartella.
man ls
:-S sort by file size
Risposte:
Usa semplicemente qualcosa come:
ls -lS /path/to/folder/
Capitale S .
Questo ordinerà i file per dimensione.
Vedi anche:
-S sort by file size
Se vuoi ordinare in ordine inverso , aggiungi semplicemente -r
switch.
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 sort
comando e gli direi di usare la quinta colonna per ordinare.
ls -lR | grep '^-' | sort -k 5 -rn
-rn
significa 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 find
comando 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
/ sort
non supporta -h
, sostituire con du -k
e sort -rn
. Si noti che le dimensioni e l' utilizzo del disco non sono la stessa cosa.
du
fornisce l'utilizzo del disco che è diverso dalla dimensione del file. Con (GNU) du -h
, l'ordinamento numerico non funzionerà ( -h
per 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.
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
.
+ |
sintassi per favore + | sort -r -h
?
Puoi usare qualcosa come trovare e ordinare.
find . -type f -ls | sort -r -n -k7
(l' -ls
opzione 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 -li
con 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'
Con zsh e GNU ls:
ls -ldU -- **/*(.OL)
Dove si (.OL)
trova un qualificatore glob , .
per selezionare solo i file regolari , OL
per invertire l'ordine per lunghezza (dimensione del file, o
per ordine crescente, O
per 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 D
qualificatore globbing:
print -rl -- **/*(.DOL)
.OL
? Fa parte del comando?
ls (GNU coreutils) 8.25
e zsh 5.1.1 (x86_64-ubuntu-linux-gnu)
. Funziona solo con alcune versioni di ls
e zsh
?
Elenco dei file per dimensione crescente sarebbe:
ls -lSr
Le opzioni sono:
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 find
si intende fare:
find . -type f -exec ls -lSd {} +
Questo "trova" tutti i file nella directory di lavoro corrente ( .
). Per ogni file trovato, ls
viene eseguito un processo per ordinare gli oggetti trovati in ordine di dimensione. Il +
terminatore a -exec
causa 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.
Elenco file visualizzato in ordine inverso: ls -lSrh
Per ordine crescente: ls -lSh
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
}
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
sed
per tagliare l'output
Aggiungendo alla risposta di Delh e al commento di Stéphane Chazelas ...
find -print0
combinato con xargs -0
aggiunge 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 .
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 ( m
in du -sm
). Altri valori accettati da du
sono -k
per i kilobyte, -g
per i gigabyte. L'uso -h
per la visualizzazione leggibile dall'uomo non è possibile perché interromperà l'ordinamento.
Ecco una versione che utilizza sed
per aggiungere il M
per 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 d
elencherà solo le sottodirectory ed escluderà i file nella cartella corrente; se vuoi vedere anche i file nella cartella corrente, rimuovili.
Nota: potresti voler usare
ncdu
invece quello che è disponibile nella maggior parte dei repository linux (su ubuntu / debianapt install ncdu
) e su osx (brew install ncdu
).