Lösung
Durch Angabe der Option -c
(oder --total
) bis du(1)
, können Sie es anweisen, eine Gesamtsumme zu erstellen. Wenn Ihre Implementierung von du(1)
beide Optionen unterstützt, können Sie den gewünschten Effekt mit dem folgenden Befehl erzielen:
$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +
BEARBEITEN: Beachten Sie, dass find
, wenn die Anzahl der Dateien die von Ihrem System zugelassene maximale Anzahl von Parametern überschreitet kann immer noch command
ausführen mehrmals. Einige Implementierungen von du(1)
unterstützt auch das Lesen der Dateinamen aus einer Datei, die nicht unter der erwähnten Einschränkung leidet:
$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames
Erklärung
Der Unterschied zwischen der Semantik von -exec command {} \;
und -exec command {} +
lautet wie folgt:
-
command {} \;
führtcommand
aus einmal für jedes Ergebnis vonfind
. Anstelle von{}
wird der Pfadname des Ergebnisses übergeben .$ touch 1 2 3 $ find 1 2 3 -maxdepth 0 -exec echo {} \; 1 2 3
-
command {} +
führtcommand
aus , wenn alle Ergebnisse abgerufen wurden. Anstelle von{}
werden die Pfadnamen der Ergebnisse übergeben .$ touch 1 2 3 $ find 1 2 3 -maxdepth 0 -exec echo {} + 1 2 3
Die -print0
Option verursacht find(1)
um die gefundenen Dateinamen getrennt durch das Nullzeichen und den --files0-from
auf der Standardausgabe auszugeben Option verursachte du(1)
um die durch Nullen getrennten Dateinamen zu lesen. Im Gegensatz zum Zeilenumbruchzeichen darf das Nullzeichen nicht in einem Dateinamen vorkommen, sodass die Ausgabe eindeutig ist.
Um mehr über die Optionen von du(1)
zu erfahren und find(1)
, sollten Sie die entsprechenden Manpages konsultieren:
$ man du
$ man find
Versuchen Sie Folgendes:
du -c `find . -name 'flibble*' -ctime +90` | tail -1
Der ursprüngliche Befehl gibt dir ein Argument und führt es dann aus, bis alle Argumente durchlaufen sind. Auf diese Weise geben Sie ihm einfach alle Argumente auf einmal, schneiden dann die einzelnen Größen ab und lassen nur die Summe übrig. Sie können das Rohr und den Schwanz entfernen, um die Größe jeder Datei anzuzeigen, wenn Sie möchten.
Sie können dies versuchen:
find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total