summiere alle Zahlen von "du"

7

Wir wollen die ersten Zahlen berechnen, von denen wir bekommen du

du -b /tmp/*
6       /tmp/216c6f99-6671-4865-b8bc-7205f5388752_resources
668669  /tmp/hadoop7887078727316788325.tmp
6       /tmp/hadoop-hdfs
42456   /tmp/hive
32786   /tmp/hsperfdata_hdfs
6       /tmp/hsperfdata_hive
32786   /tmp/hsperfdata_root
262244  /tmp/hsperfdata_yarn

so wird die endgültige Summe sein

sum=6+668669+6+42456+32786+6+32786+262244


echo $sum

Wie können wir es mit awk oder perl one linern machen?

Yael
quelle

Antworten:

16

In AWK:

{ sum += $1 }
END { print sum }

Damit

du -b /tmp/* | awk '{ sum += $1 } END { print sum }'

Beachten Sie, dass das Ergebnis nicht korrekt ist, wenn die Verzeichnisse unter /tmpselbst Unterverzeichnisse haben, da dulaufende Summen für Verzeichnisse und deren untergeordnete Elemente erstellt werden.

du -sberechnet die Summe für Sie korrekt (für alle Unterverzeichnisse und Dateien in /tmp, einschließlich versteckter):

du -sb /tmp

und du -cberechnet auch die Summe der aufgelisteten Verzeichnisse und Dateien korrekt:

du -cb /tmp/*
Stephen Kitt
quelle
4

Es ist einfach, Sie können verwenden:

 du -b /tmp/* | awk 'BEGIN{i=0} {i=i+$1} END{print i}'

Wenn Sie keinen Platzhalter verwenden, wenn Sie einen Verzeichnisnamen wie verwenden /tmp, müssen Sie den letzten Eintrag vermeiden, da die Ausgabe von du -b /tmpwie folgt lautet:

size1 file1
size2 file2
size_total .

Jetzt sollten Sie diesen letzten Eintrag vermeiden. Verwenden Sie also:

du -b /tmp | awk 'BEGIN{i=0} {if( $2 != "." ){i=i+$1}} END{print i}'

Sie können jedoch auch die -sOption verwenden. Sie berechnet die Zusammenfassung für Sie, dann müssen Sie die Werte nicht hinzufügen. Drucken Sie einfach die letzte aus, dh:

du -s directory
Prvt_Yadav
quelle
1
Variablen werden auf Null initialisiert, wenn Sie ein paar Bytes
Jeff Schaller
4

Sie können auch eine Gesamtsumme ausgewählter Dateien mit erstellen du -c. Dies funktioniert auch dann, wenn ein Argument von dukein Verzeichnis ist. Was ist nicht der Fall bei du -s:

$ du -sb file1 file2
17  file1
18  file2

$ du -cb file1 file2
17  file1
18  file2
35  total

Übrigens empfehle ich für die interaktive Verwendung das Hinzufügen einer -hOption anstelle eines -banderen Multiplikators der Blockgröße. Dadurch wird die Größe im lesbaren Einheitenformat gedruckt.

$ du -ch file1 file2
4.0K    file1
4.0K    file2
8.0K    total
jimmij
quelle
1
Dies ist die beste Antwort für mich.
WinEunuuchs2Unix