Devo trovare i file più grandi in una cartella.
Come posso scansionare una cartella in modo ricorsivo e ordinare i contenuti per dimensione?
Ho provato a usare ls -R -S
, ma questo elenca anche le directory.
Ho anche provato a usare find
.
Devo trovare i file più grandi in una cartella.
Come posso scansionare una cartella in modo ricorsivo e ordinare i contenuti per dimensione?
Ho provato a usare ls -R -S
, ma questo elenca anche le directory.
Ho anche provato a usare find
.
Risposte:
Puoi anche farlo con solo du
. Per sicurezza, sto usando questa versione di du
:
$ du --version
du (GNU coreutils) 8.5
L'approccio:
$ du -ah ..DIR.. | grep -v "/$" | sort -rh
Il comando du -ah DIR
produrrà un elenco di tutti i file e le directory in una determinata directory DIR
. Il -h
produrrà formati leggibili che preferisco. Se non li desideri, rilascia l'interruttore. Sto usando il head -6
giusto per limitare la quantità di output!
$ du -ah ~/Downloads/ | head -6
4.4M /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K /home/saml/Downloads/kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M /home/saml/Downloads/kodak_W820_wireless_frame
8.0K /home/saml/Downloads/bugs.xls
604K /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf
Abbastanza facile da ordinare dal più piccolo al più grande:
$ du -ah ~/Downloads/ | sort -h | head -6
0 /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock
Invertire, dal più grande al più piccolo:
$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G /home/saml/Downloads/audible/audio_books
3.8G /home/saml/Downloads/audible
2.3G /home/saml/Downloads/apps_archive
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G /home/saml/Downloads/digital_blasphemy
Non mostrarmi la directory, solo i file:
$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6
3.8G /home/saml/Downloads/audible/audio_books
3.8G /home/saml/Downloads/audible
2.3G /home/saml/Downloads/apps_archive
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G /home/saml/Downloads/digital_blasphemy
835M /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
Se vuoi solo l'elenco dei più piccoli ai più grandi, ma i primi 6 file offensivi puoi invertire l'opzione di ordinamento, rilasciare ( -r
) e utilizzare tail -6
invece di head -6
.
$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
835M /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
1.5G /home/saml/Downloads/digital_blasphemy
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
2.3G /home/saml/Downloads/apps_archive
3.8G /home/saml/Downloads/audible
3.8G /home/saml/Downloads/audible/audio_books
grep -v "/$"
parte non sembra fare ciò che ti aspettavi, poiché alle directory non è stata aggiunta una barra. Qualcuno sa come escludere le directory dai risultati?
/
s finale - per esempio /home/saml/Downloads/audible
sembra essere una directory, ma non ha una barra. /home/saml/Downloads/
Ha solo una barra, ma probabilmente perché l'hai scritta con una barra quando hai specificato l'argomento iniziale du
.
Se vuoi trovare tutti i file nella directory corrente e nelle sue sottodirectory ed elencarli in base alle loro dimensioni (senza considerare il loro percorso), e supponendo che nessuno dei nomi dei file contenga caratteri di nuova riga, con GNU find
, puoi farlo:
find . -type f -printf "%s\t%p\n" | sort -n
Da man find
un sistema GNU:
-printf format
True; print format on the standard output,
interpreting `\' escapes and `%' directives.
Field widths and precisions can be specified
as with the `printf' C function. Please note
that many of the fields are printed as %s
rather than %d, and this may mean that flags
don't work as you might expect. This also
means that the `-' flag does work (it forces
fields to be left-aligned). Unlike -print,
-printf does not add a newline at the end of
the string. The escapes and directives are:
%p File's name.
%s File's size in bytes.
Da man sort
:
-n, --numeric-sort
compare according to string numerical value
Prova il seguente comando:
ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20
Elencherà ricorsivamente i primi 20 file più grandi nella directory corrente.
Nota: l'opzione -h
per sort
non è disponibile su OSX / BSD, quindi è necessario installare sort
da coreutils
(ad es. Via brew
) e applicare il percorso bin locale a PATH
, ad es.
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.
In alternativa, utilizzare:
ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20
Per le directory più grandi utilizzare du
, ad esempio:
du -ah . | sort -rh | head -20
o:
du -a . | sort -rn | head -20
Questo troverà tutti i file in modo ricorsivo e li ordinerà per dimensione. Stampa tutte le dimensioni dei file in KB e arrotonda per eccesso in modo da poter vedere i file 0 KB, ma era abbastanza vicino per i miei usi e funziona su OSX.
find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1
find . -type f
trova i file ... funziona in modo ricorsivo, hai ragione, ma elenca tutti i file che trova, non le directory stesse
Con zsh
, troverai il file più grande (in termini di dimensioni apparenti come la colonna size ls -l
nell'output, non l'utilizzo del disco) con:
ls -ld -- **/*(DOL[1])
Per i 6 più grandi:
ls -ld -- **/*(DOL[1,6])
Per ordinare quelli per dimensione del file, puoi usare l ls
' -S
opzione. Alcune ls
implementazioni hanno anche -U
un'opzione per ls
non ordinare l'elenco (dato che è già ordinato per dimensione zsh
qui).
Questo è un bisogno incredibilmente comune per una serie di motivi (mi piace trovare il backup più recente in una directory) ed è un compito sorprendentemente semplice.
Fornirò una soluzione Linux che utilizza le utility find, xargs, stat, tail, awk e sort.
La maggior parte delle persone ha fornito alcune risposte uniche, ma preferisco la mia perché gestisce correttamente i nomi dei file e il caso d'uso può essere facilmente modificato (modifica stat e ordina argomenti)
Fornirò anche una soluzione Python che dovrebbe consentirti di utilizzare questa funzionalità anche su Windows
find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n
# Each utility is split on a new line to help
# visualize the concept of transforming our data in a stream
find . -type f -print0 |
xargs -0 -I{} stat -c '%s %n' {} |
sort -n |
tail -n 1 |
awk '{print $2}'
# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} |
sort -n | tail -n 1 | awk '{print $2}'
Spiegazione:
#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
for filename in filenames:
realpath = os.path.join(dirpath, filename)
files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)
Questo script richiede un po 'più di tempo per essere spiegato, ma essenzialmente se lo salvi come script, cercherà il primo argomento fornito nella riga di comando e restituirà il file più grande in quella directory. Lo script non verifica errori, ma dovrebbe darti un'idea di come affrontarlo in Python, il che ti offre un modo indipendente di piattaforma per risolvere questo problema.
Variante di questa risposta da una domanda simile
find . -type f -exec du -ah {} + | sort -rh | more
Prova sotto il comando con l'opzione di ordinamento per avere cartelle con dimensioni in ordine crescente
du -sh * | sort -sh