Ordinamento dei file in base alla dimensione in modo ricorsivo


80

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.


1
Vuoi elencare i file in ogni sottodirectory separatamente o vuoi trovare tutti i file in tutti i sottodirectory ed elencarli per dimensione indipendentemente da quale sottodirectory si trovano? Inoltre, cosa intendi per "directory" e "cartella"? Sembra che tu li stia usando per descrivere cose diverse.
terdon

Stai dicendo che vuoi solo elencare i file in una determinata directory e i file nelle sue sottodirectory senza mostrare solo le sottodirectory? Prova a ripulire la tua domanda, non è molto chiaro.
slm

Risposte:


93

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

Ripartizione dell'approccio

Il comando du -ah DIRprodurrà un elenco di tutti i file e le directory in una determinata directory DIR. Il -hprodurrà formati leggibili che preferisco. Se non li desideri, rilascia l'interruttore. Sto usando il head -6giusto 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 -6invece 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

14
La 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?
Jan Warchoł,

@JanekWarchol - quale versione di coreutils stai usando?
slm

Sono il 8.13. Ma comunque, l'output nella tua risposta non ha nemmeno una /s finale - per esempio /home/saml/Downloads/audiblesembra 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.
Jan Warchoł,

1
Questo trova anche
dirs

1
Questo non elenca solo i file, ma elenca anche le directory :(
Roman Gaufman,

21

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 findun 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

Purtroppo non funziona su Mac, mostra: trova: -printf: primario o operatore sconosciuto
Roman Gaufman,

@RomanGaufman sì, ecco perché la risposta specifica GNU find. Se installi gli strumenti GNU sul tuo Mac, funzionerà anche lì.
terdon

11

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 -hper sortnon è disponibile su OSX / BSD, quindi è necessario installare sortda 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

3
Perfetto, questa è la prima soluzione che funziona su Mac e non mostra directory :) - grazie!
Roman Gaufman,

come filtro per mostrare solo il file con il numero di righe> = X? (X = 0 per esempio)
Matrix

7

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


ha funzionato anche su Ubuntu 14.04!
David Lam,

Questo elenca le directory, non solo i file :(
Roman Gaufman,

@RomanGaufman - grazie per il feedback! dai miei test, find . -type ftrova i file ... funziona in modo ricorsivo, hai ragione, ma elenca tutti i file che trova, non le directory stesse
Brad Parks

Xargs è stato utilizzato negli anni '80. È una cattiva idea dal 1989, quando execplus è stato introdotto da David Korn.
schily

5

Con zsh, troverai il file più grande (in termini di dimensioni apparenti come la colonna size ls -lnell'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' -Sopzione. Alcune lsimplementazioni hanno anche -Uun'opzione per lsnon ordinare l'elenco (dato che è già ordinato per dimensione zshqui).


3

Soluzione semplice per Mac / Linux che salta le directory:

find . -type f -exec du -h {} \; | sort -h

2

L'equivalente in BSDo OSXè

$ du -ah simpl | sort -dr | head -6

0

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

Soluzione da riga di comando di Linux

Restituisce ricorsivamente l'intero elenco di soli file da una directory, ordinati per dimensione del file

find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n

Come prima, ma questa volta restituisce il file più grande.

# 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}'

Stesso modello esatto, ma ora seleziona il file più recente anziché il più grande

# (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:

  1. find: trova ricorsivamente tutti i file dalla directory corrente e li stampa con un carattere null
  2. xargs: utility per eseguire comandi usando argomenti forniti dallo standard input. Per ogni riga di output, vogliamo eseguire l'utilità stat su quel file
  3. stat: Stat è un fantastico comando a tutto tondo che ha così tanti casi d'uso. Sto stampando due colonne, la prima colonna è la dimensione del blocco (% s) e la seconda colonna è il nome del file (% n)
  4. ordina: ordina i risultati con l'interruttore numerico. Poiché il primo argomento è un numero intero, i nostri risultati verranno ordinati correttamente
  5. tail: seleziona solo l'ultima riga dell'output (poiché l'elenco è ordinato, questo è il file più grande!)
  6. awk: selezionare la seconda colonna, che contiene il nome file, ed è il file più grande in una directory ricorsiva.

Soluzione Python

#!/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.



0

Prova sotto il comando con l'opzione di ordinamento per avere cartelle con dimensioni in ordine crescente

du -sh * | sort -sh


-1

Qualcosa che funziona su qualsiasi piattaforma tranne AIX e HP-UX è:

find . -ls | sort +6 | tail
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.