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.

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.


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.


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}'

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.