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 {} \;eseguecommanduna 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