Soluzione
Fornendo l'opzione -c
(o --total
) a du(1)
, puoi istruirlo a produrre un totale generale. Se la tua implementazione di du(1)
supporta una di queste opzioni, puoi ottenere l'effetto desiderato usando il seguente comando:
$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +
MODIFICA: Nota che se il numero di file supera il numero massimo di parametri consentiti dal tuo sistema, find
può ancora eseguire command
più volte. Alcune implementazioni di du(1)
supporta anche la lettura dei nomi dei file da un file, che non soffre della suddetta limitazione:
$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames
Spiegazione
La differenza tra la semantica di -exec command {} \;
e -exec command {} +
è il seguente:
-
command {} \;
eseguecommand
una volta per ogni risultato difind
. Viene passato il percorso del risultato invece di{}
.$ touch 1 2 3 $ find 1 2 3 -maxdepth 0 -exec echo {} \; 1 2 3
-
command {} +
eseguecommand
, quando tutti i risultati sono stati recuperati. I percorsi dei risultati vengono passati invece di{}
.$ touch 1 2 3 $ find 1 2 3 -maxdepth 0 -exec echo {} + 1 2 3
Il -print0
opzione provoca find(1)
per stampare i nomi dei file trovati sullo standard output separati dal carattere null e dal --files0-from
opzione ha causato du(1)
per leggere i nomi di file separati da null. A differenza del carattere di nuova riga, il carattere null potrebbe non apparire in un nome file, quindi l'output non è ambiguo.
Per ulteriori informazioni sulle opzioni di du(1)
e find(1)
, dovresti consultare le rispettive manpage:
$ man du
$ man find
Prova questo:
du -c `find . -name 'flibble*' -ctime +90` | tail -1
Il comando originale fornisce du un argomento, quindi lo esegue, finché non passa attraverso tutti gli argomenti. In questo modo, gli stai semplicemente dando tutti gli argomenti in una volta, quindi tagliando le dimensioni separate e lasciando solo il totale. Puoi rimuovere il tubo e la coda per mostrare la dimensione di ciascun file, se lo desideri.
Puoi provare questo:
find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total