Ich möchte die Größe der Datei mit der Erweiterung .o (Objektdatei) in meinem Basisordner erfahren.
Ich kann alle Objektdateien mit finden
find . -name '*.o'
Wie kann ich nun die Gesamtgröße dieser Dateien berechnen?
quelle
Ich möchte die Größe der Datei mit der Erweiterung .o (Objektdatei) in meinem Basisordner erfahren.
Ich kann alle Objektdateien mit finden
find . -name '*.o'
Wie kann ich nun die Gesamtgröße dieser Dateien berechnen?
Du suchst nach Rohren ( |
). Sie sind eine Möglichkeit, mehrere Befehle zu verbinden und die Ausgabe eines Befehls als Eingabe an einen anderen zu übergeben. In diesem Fall möchten Sie alle Dateinamen übergeben, die Sie als Eingabe finden du
(berechnet die Größe). Da jedoch du
Dateinamen erwartet werden und die Ergebnisse find
nur eine Textliste sind (ja, der Text besteht aus Dateinamen, du
kann aber nicht wissen, dass nur Text angezeigt wird), müssen Sie so etwas wie xargs
das verwenden, was jeweils benötigt wird Textzeile, behandeln Sie sie als Dateinamen und übergeben Sie diese an du
. Wenn wir all dies zusammenfassen, erhalten wir:
find . -name "*.o" | xargs du -sch
du solltest immer die Muster zitieren, die Sie geben find
(wie ich oben tat:) "*.o"
. Wenn Sie dies nicht tun, erweitert die Shell das Feld *.o
auf die Namen aller übereinstimmenden Dateien im aktuellen Verzeichnis. In diesem Fall hat es nur funktioniert, weil Sie keine passenden Dateien hatten.
Die -sch
Flags für du
sind in dokumentiertman du
:
-c, --total
produce a grand total
-h, --human-readable
print sizes in human readable format (e.g., 1K 234M 2G)
-s, --summarize
display only a total for each argument
Beachten Sie jedoch, dass dies für Dateinamen mit Leerzeichen fehlschlägt. Dies wird mit ziemlicher Sicherheit kein Problem für Objektdateien sein. Wenn Sie sich jedoch in Zukunft auch mit Leerzeichen befassen müssen, verwenden Sie:
find . -name "*.o" -print0 | xargs -0 du -sch
Das -print0
machtfind
gedruckt werden NULL-getrennte Leitungen und die -0
Marken xargs
nehmen solche Linien als Eingabe.
Alternativ können Sie haben find
die Größen selbst ausdrucken und dann summieren:
find . -name "*.o" -printf '%s\n' | awk '{c+=$1}END{print c}'
Dies wird auch das von @Serg in erwähnte Problem umgehen den Kommentaren dem zu viele Argumente und der Befehl in separate Befehle unterteilt ist.
Wenn Sie bash
(wahrscheinlich) verwenden, gibt es einen einfacheren Weg:
shopt globstar
du -sch **/*.o
Mit diesem shopt globstar
Befehl werden **
alle Dateien und / oder Unterverzeichnisse abgeglichen. Nach dem Aktivieren**/*.o
werden alle Dateien (und Verzeichnisse) abgeglichen .o
, deren Name auf endet , damit wir das direkt weitergeben können du
.
Beachten Sie, dass im Gegensatz zum find
Ansatz keine versteckten Dateien gefunden werden (diejenigen, deren Name mit einem beginnt .
). Um diese auch abzugleichen, gehen Sie wie folgt vor:
shopt -s dotglob globstar
du -sch **/*.o
du
, und es werden mehreretotal
Zeilen erzeugt. Beispiel: paste.ubuntu.com/23092752Verwenden Sie
-exec
flag, um dendu
Befehl mit;
(Bedeutung pro Datei) auszuführen.Beispielausgabe:
find
ist rekursiv - was bedeutet, dass alle Unterverzeichnisse durchsucht werden. Wenn Sie nur die Gesamtzahl aller*.o
Dateien im aktuellen Verzeichnis abrufen möchten , tun Sie dies einfachquelle
mit perl:
Größe aller nicht ausgeblendeten PDF-Dateien im aktuellen Verzeichnis.
quelle
.o
Dateien und sie könnten sich in Unterverzeichnissen befinden. Sie können auch ein}{
Vorher hinzufügenprint $sum
, um zu vermeiden, dass die Summe bei jeder Iteration gedruckt wird. Wir wollen nur den letzten.