Gibt es eine Möglichkeit, die Größe der aufgelisteten Dateien zusammenzufassen?

20

Dies ist der Befehl, den ich verwende, um einige Dateien aufzulisten:

find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \;
-rw-r--r--   1 qa1wrk15   test       1265190 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_7.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1345554 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_2.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1370532 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_3.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1399854 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_8.20110929.extract.sys

und so weiter.

Jetzt möchte ich die Gesamtgröße dieser Dateien durch Summieren der 5. Spalte berechnen. Ich dachte an die Verwendung awk, um dies zu tun, so habe ich Folgendes in einem bestimmten Verzeichnis getestet

>ls -lrt | awk `{ print $1 }`
ksh: syntax error at line 1 : `{' unmatched

Ich verstehe nicht was das Problem ist, warum dieser Syntaxfehler .

Ich denke zu versuchen

ls -lrt | awk `BEGIN {total = 0} {for(i=0;i<NR;i++){total+=$5}} END {printf "%d",total} 

dies auch, aber ein einfaches awkSkript funktioniert nicht.

Bitte schlagen Sie mich vor oder korrigieren Sie mich, wenn ich falsch liege oder eine Problemumgehung vorliegt.

münchen
quelle

Antworten:

25

Zunächst sollten Sie gerade einfache Anführungszeichen ( ') verwenden, nicht die geneigten ( `).

Das awkInline-Skript könnte folgendermaßen aussehen:

ls -lrt | awk '{ total += $5 }; END { print total }'

Daher muss das Skript nicht initialisiert werden total( awkes wird auf Null initialisiert), und es muss keine Schleife awkausgeführt werden. Das Skript wird bereits in jeder Eingabezeile ausgeführt.

Enzotib
quelle
1
Zusammenfassend wäre der find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \; | awk '{ total += $5 }; END { print total }'
Einzeiler
16

@enzotib hat bereits darauf hingewiesen, was Ihr Syntaxfehler ist - ich werde auf eine kleine Tangente gehen.

Das Summieren einer Zahlenspalte ist eines der Dinge, die immer wieder auftauchen. Ich habe diese Shell-Funktion erhalten:

sumcol() 
{ 
    awk "{sum+=\$$1} END {print sum}"
}

Damit wird Ihre Lösung:

ls -lrt | sumcol 5

Das summiert die Zahlen in Spalte 5 und gibt den Wert aus.

camh
quelle
Tatsächlich habe ich mich gefragt, warum es dafür kein Standarddienstprogramm gibt.
Enzotib
Geht gleich in meine .aliasesAkte.
Konrad Rudolph
13

Hier ist eine andere Möglichkeit, dies zu tun du:

find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'
Smoking
quelle
1
Ausgezeichnete Verwendung von du. Nettes Beispiel. Als zusätzlichen Vorteil können Sie du die Option "-h" hinzufügen, um die Ausgabe in Gig zu erhalten. Dann müssen Sie keine Ziffern und so weiter zählen. Ich habe gerade einen Test mit einer Reihe von Dateien durchgeführt, die ungefähr 1188800 KB groß sind. Wie groß ist das? Egal, du -ch --files0-from=-sagt mir, dass meine Summe "9.0G" ist. Süßer!
Mike S
Süße, ausgezeichnete Verwendung von du!
Haridsv
Auch wenn Sie nur an der Summe interessiert sind, dann leiten Sie die Ausgabe an tail -1.
haridsv
4

Falls HP-UX findauch über eine -printfOption verfügt, wäre dies nützlich, um eine Formel für bcdie Berechnung zu erstellen :

( find . -name \*.extract.sys -size +1000000c -printf '%s+'; echo 0 ) | bc

Wenn die Formel zu groß wird, kann sie schrittweise berechnet werden:

( find . -name \*.extract.sys -size +1000000c -printf 's+=%s\n'; echo s ) | bc
Mann bei der Arbeit
quelle
1

Mit GNU find:

find -name '*.extract.sys' -size +1000000c -printf '%s\n' | jq -s add

Mit GNU stat:

find . -name '*.extract.sys' -size +1000000c -exec stat -c%s '{}' + | jq -s add

Mit BSD stat:

find . -name '*.extract.sys' -size +1000000c -exec stat -f%z '{}' + | jq -s add
Nisetama
quelle
Ist jqein Dienstprogramm? Scheint nicht auf der Debian-Distribution zu finden (Debian 4.9.51-1 (2017-09-28) x86_64 GNU / Linux)
Death Metal