Ottenere le dimensioni solo con du file


51

Come posso ottenere la dimensione di tutti i file e di tutti i file nelle sue sottodirectory usando il comando du.

Sto provando il seguente comando per ottenere la dimensione di tutti i file (e file nelle sottodirectory)

find . -type f | du -a

Ma questo stampa anche le dimensioni della cartella. Come posso ottenere un elenco di dimensioni di tutti i file e file nelle sottodirectory? Ho anche provato il exec flagma non sono sicuro di come convogliare l'output in un altro comando dopo aver eseguito i risultati di findin du.

Il sistema operativo è AIX 6.1 con shell ksh.

Risposte:


57

Di solito uso l' -executilità. Come questo:

find . -type f -exec du -a {} +

L'ho provato sia su bash che su ksh con GNU find. Non ho mai provato AIX, ma sono sicuro che la tua versione di find abbia qualche -execsintassi.

Il frammento seguente ordina l'elenco, per primo il più grande:

find . -type f -exec du -a {} + | sort -n -r | less

3
Andrei con questa risposta se non si ha accesso find -print0o altre funzionalità GNU. Se disponibile, la sostituzione \;con \+comporterà un minor numero di invocazioni due quindi migliori prestazioni.
jw013,

Grazie, questo funziona alla grande soprattutto perché du offre una bandiera per dimensioni in unità diverse.
Shardul Upadhyay,

Non sono riuscito a trovare informazioni +sull'opzione. È un'opzione per duo per find? E perché provoca meno chiamate?
Amelio Vazquez-Reina,

1
È un'opzione standard di find. Specifica al execcomando (nel nostro caso du) una sola volta, con tutti i risultati di finddato come argomenti successivi al comando.
Rahmu,

wtf, perché non c'è un comando comedu -f --threshold=1G
Alexander Mills il

16

Se hai utility GNU, prova

find . -type f -print0 | du --files0-from=-

Il comando non riesce a dire che print0 non è un comando valido e che l'ultimo segno negativo non era un flag riconosciuto. Non penso che questo approccio funzionerà perché man dunon elenca un fileso un fromflag.
Shardul Upadhyay,

È necessario aggiungere il sistema operativo come tag alla domanda. Ho pensato che avessi GNU, ma ho dimenticato di menzionarlo.
jw013,

1
Abbi un voto su di me! La tua soluzione particolare funziona du -chper ottenere un totale di file corrispondenti:find . -name 'blah blah.*' -print0 | du --files0-from=- -ch
Michael Goldshteyn,

9

In genere utilizzo:

find . -type f -print0 | xargs -r0 du -a

Xargs di solito chiama il comando, anche se non ci sono argomenti passati; xargs du </dev/nullverrà comunque chiamato, xargs -r du </dev/nullnon chiamerà du. L' -0argomento cerca le stringhe con terminazione null anziché la nuova riga terminata.

Quindi di solito aggiungo | awk '{sum+=$1} END {print sum}'alla fine per ottenere il totale.


2
L' then I usually addvale oro :-)
Radek

2

Ecco una versione con nomi di parametri lunghi e ordinamento umano.

find . -type f -exec du --human {} + | sort --human --reverse | head

Ho anche visto alcun bisogno di -a/--allessere passato a du.


-2

file specifici nella directory corrente

du -ch files*

è più corto e funziona per me

du -sh .

per dir corrente e tutti i file in sub

du (GNU coreutils) 8.30


1
(1) Cosa intendi con du -ch files*? Supponiamo che la directory corrente contiene ant, apple, banana, bat, cat, corn, date, e dog, dove i nomi di animali sono sottodirectory e le frutta / verdura nomi sono file - Quale comando si usa per ottenere solo i file? O non è quello che volevi dire? (2)  du -sh .riporterà solo un totale di tutto dentro e sotto la directory corrente, e non i file stessi. Questo è praticamente l'esatto contrario di ciò che la domanda ha posto.
G-Man dice "Reinstate Monica" il
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.