Wenn files.txt
ich eine Liste der Dateien in habe , kann ich eine Liste ihrer Größen wie folgt erhalten:
cat files.txt | xargs ls -l | cut -c 23-30
was so etwas hervorbringt:
151552
319488
1536000
225280
Wie kann ich die Summe all dieser Zahlen ermitteln?
alias sum="paste -sd+ - | bc"
zur Fertigstellung der Shell hinzugefügt, danke mate. . .| x=$(echo <(cat)); echo $((0+${x// /+}+0))
Wenn Sie alle Bash die ganze Zeit wollen:/usr/bin/sum
bc
ist auf einigen Systemen nicht verfügbar!awk
Andererseits ist (glaube ich) für die POSIX-Konformität erforderlich.Hier geht
quelle
cut
? Das ist eine vorhersehbare Spaltennummer, also benutze... | xargs ls -l | awk '{total = total + $5}{END{print total}'
total+=$1
anstelle vontotal = total + $1
Anstatt cut zu verwenden, um die Dateigröße aus der Ausgabe von ls -l zu ermitteln , können Sie direkt Folgendes verwenden:
Awk interpretiert "$ 5" als fünfte Spalte. Dies ist die Spalte von ls -l , in der die Dateigröße angegeben ist.
quelle
cat funktioniert nicht, wenn in Dateinamen Leerzeichen vorhanden sind. Hier ist stattdessen ein Perl-Einzeiler.
quelle
Oder wenn Sie nur die Zahlen summieren möchten, leiten Sie Folgendes ein:
quelle
... | python -c'import sys; print(sum(int(x) for x in sys.stdin))'
wenn Python 2 Ende dieses Jahres verschwindet.TMTWWTDI : Perl hat einen Dateigrößenoperator (-s)
quelle
Das ganze ls -l und dann geschnitten ist ziemlich verworren, wenn Sie stat haben . Es ist auch anfällig für das genaue Format von ls -l (es hat nicht funktioniert, bis ich die Spaltennummern für cut geändert habe )
Auch die nutzlose Verwendung von Katze behoben .
quelle
<infile command
dasselbe ist (und in einer besseren Reihenfolge als)command <infile
.Wenn Sie bc nicht installiert haben, versuchen Sie es
anstatt
$( )
<- Gibt den Wert für die Ausführung des Befehls zurück$(( 1+2 ))
<- gibt die ausgewerteten Ergebnisse zurückecho
<- Echo auf dem Bildschirmquelle
Sie können das folgende Skript verwenden, wenn Sie nur Shell-Skripte ohne awk oder andere Interpreter verwenden möchten:
quelle
Ich würde stattdessen "du" verwenden.
Wenn Sie nur die Nummer wollen:
quelle
files.txt
es groß ist. Wenn die Anzahl der Argumente,xargs
die weitergeleitet werden, einen bestimmten Schwellenwert erreicht, werden sie über mehrere Aufrufe an aufgeteiltdu
. Die am Ende angezeigte Summe ist die Summe nur für den letzten Anruf beidu
, nicht für die gesamte Liste.In ksh:
quelle
cut
von zu lernen, aber Sie ignorieren die Fähigkeit von awks, die Mathematik zu machen ...Pipe to gawk:
quelle
Hier ist meins
quelle
quelle
Ich benutze gerne ....
Sie zeigen die Summe jeder Zeile ...
Anwendung über diese Situation:
Total ist der letzte Wert ...
quelle
Sie können die awk verwenden, um dasselbe zu tun, und sogar die Nicht-Ganzzahlen überspringen
oder Sie können den Befehl ls verwenden und die vom Menschen lesbare Ausgabe berechnen
quelle
awk '{ total += $1} END {print total}' files.txt
ist schnellerMeiner Meinung nach ist die einfachste Lösung dafür der Unix-Befehl "expr":
quelle
Pure Bash
quelle
Oder Sie können sie einfach zusammenfassen, während Sie die Größen lesen
Wenn Sie sich nicht für Bissgrößen und Blöcke interessieren, ist das in Ordnung
quelle
Wenn Sie R haben, können Sie verwenden:
Da ich mit R vertraut bin, habe ich tatsächlich mehrere Aliase für solche Dinge, damit ich sie verwenden kann,
bash
ohne mich an diese Syntax erinnern zu müssen. Zum Beispiel:was lass mich machen
Inspiration: Gibt es eine Möglichkeit, Min, Max, Median und Durchschnitt einer Liste von Zahlen in einem einzigen Befehl zu ermitteln?
quelle