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.