it-swarm.com.de

Summe der Dateigrößen in der Verzeichnisliste anzeigen

Der Befehl Windows dir Verzeichnisliste enthält am Ende eine Zeile, in der der Gesamtplatz angegeben ist, der von den aufgelisteten Dateien belegt wird. Beispielsweise zeigt dir *.exe Alle .exe - Dateien im aktuellen Verzeichnis, ihre Größen und die Gesamtsumme ihrer Größen an. Ich würde gerne ähnliche Funktionen mit meinem dir Alias ​​in bash haben, aber ich bin mir nicht sicher, wie ich genau vorgehen soll.

Derzeit habe ich alias dir='ls -FaGl' In meinem .bash_profile Angezeigt

drwxr-x---+  24 mattdmo  4096 Mar 14 16:35 ./
drwxr-x--x. 256 root    12288 Apr  8 21:29 ../
-rw-------    1 mattdmo 13795 Apr  4 17:52 .bash_history
-rw-r--r--    1 mattdmo    18 May 10  2012 .bash_logout
-rw-r--r--    1 mattdmo   395 Dec  9 17:33 .bash_profile
-rw-r--r--    1 mattdmo   176 May 10  2012 .bash_profile~
-rw-r--r--    1 mattdmo   411 Dec  9 17:33 .bashrc
-rw-r--r--    1 mattdmo   124 May 10  2012 .bashrc~
drwx------    2 mattdmo  4096 Mar 24 20:03 bin/
drwxrwxr-x    2 mattdmo  4096 Mar 11 16:29 download/

zum Beispiel. Nehmen Sie die Antworten von diese Frage :

dir | awk '{ total += $4 }; END { print total }'

das gibt mir die Summe, druckt aber nicht die Verzeichnisliste selbst. Gibt es eine Möglichkeit, dies in ein Einzeiler- oder Shell-Skript zu ändern, damit ich alle ls Argumente übergeben kann, die ich dir möchte, und eine vollständige Liste plus Gesamtsumme erhalte? Zum Beispiel möchte ich dir -R *.jpg *.tif Ausführen, um die Liste und die Gesamtgröße dieser Dateitypen in allen Unterverzeichnissen zu erhalten. Im Idealfall wäre es großartig, wenn ich die Größe jedes Unterverzeichnisses ermitteln könnte, aber dies ist nicht unbedingt erforderlich.

82
MattDMo

Die folgende Funktion erledigt das meiste, wonach Sie fragen:

dir () { ls -FaGl "${@}" | awk '{ total += $4; print }; END { print total }'; }

... aber es gibt Ihnen nicht das, was Sie von dir -R *.jpg *.tif verlangen, denn so funktioniert ls -R nicht. Vielleicht möchten Sie dafür mit dem Dienstprogramm find herumspielen.

26
user27282

Hierfür gibt es bereits einen UNIX-Befehl: du

Mach einfach:

du -ach 

Gemäß Konvention können Sie am Ende des Befehls einen oder mehrere Datei- oder Verzeichnispfade hinzufügen. -h ist eine Erweiterung zum Konvertieren der Größe in ein benutzerfreundliches Format. -a gibt Ihnen die "scheinbare" Größe (Dateigröße anstelle der Festplattennutzung) und -c gibt am Ende eine Summe an.

168
Pete Cornell

Sie können du -h -c directory|tail -1 Verwenden.

Dadurch wird eine einzelne Zeile mit Speichernutzung generiert.

23
mani deepak

Drucken Sie einfach die aktuelle Zeile aus, die Sie summieren:

dir | awk '{ print; total += $4 }; END { print "total size: ",total }'
8
Mauritz Hansen

mit Perl:

Perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

Größe aller nicht ausgeblendeten PDF -Dateien im aktuellen Verzeichnis.

6
ingopingo

Das Hinzufügen von Folgendem zu .bash_profile oder .bashrc funktioniert für mich.

dir ()
{
find . -iname "[email protected]" -exec ls -lh {} \;
find . -iname "[email protected]" -print0|xargs -r0 du -csh|tail -n 1;
}

Wenn ich jetzt ein dir * .mp3 mache, wird es rekursiv ausgeführt und am Ende insgesamt gedruckt. Sie können steuern, wie viel Tiefe Sie möchten, indem Sie dem Find einen Parameter maxdepth hinzufügen. Ich weiß, dass es keine sehr effektive Idee ist, Find zweimal zu laufen. Aber ich könnte mir keinen besseren Weg vorstellen. Zumindest erledigt es die Arbeit.

1
bagavadhar

Wenn Sie d und eine awk Anweisung wie die oben erwähnte verwenden, erhalten Sie das, wonach Sie suchen.

Beispiel: du /home/abc/Downloads/*.jpg | awk '{ print; total += $1 }; END { print "total size: ",total }'

Dadurch werden alle Dateien im Ordner Downloads des Benutzers abc aufgelistet, die mit .jpg enden, und die Summe aller dieser Dateien wird am Ende der Liste gedruckt.

1
user3085123
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'
0
Tamer Mansour

Zum Zählen von Dateien in einem Verzeichnis mithilfe einer Maske tendiere ich dazu, diesen Ansatz zu verfolgen:

Für Bytes

du -ac --bytes  | grep "Zip$" | awk '{ print; total += $1 }; END { print "total lobsters: ", total, " Bytes" }'

Für Kilobyte

du -ac --bytes  | grep "Zip$" | awk '{ print; total += $1 }; END { print "total lobsters: ", total/1024, " KB" }'

Für Megabyte

du -ac --bytes  | grep "Zip$" | awk '{ print; total += $1 }; END { print "total lobsters: " total/1024/1024 " MB" }'

Du hast die Idee.

Die Aufteilung ist einfach:

  • d - Festplattennutzung
    • -a - alle Dateien
    • -c - Gesamtbytes
    • --bytes - Ausgabe in Bytes drucken [in neueren Versionen von bash nicht sicher, ob dies nicht mehr gilt]
  • grep - g lobal r egular e xpression p rint [druckt übereinstimmende Ausgabemuster aus]
    • "Zip $" - passendes Muster. 'Zip' ist die Zeichenfolge, und das '$' bezeichnet das Ende der Zeichenfolge/Zeile/usw. - in diesem Fall stimmen Sie mit den Zeilen überein, die [~ # ~] end [~ # ~] mit ' Postleitzahl'. Umgekehrt bedeutet das Platzieren von '^' am Anfang der Zeichenfolge, dass sich das Muster am Anfang der Zeichenfolge befindet [dh: "^ start" stimmt mit den Zeilen begin mit dem Wort 'start' überein. ] - Mit diesem Wissen werden beim Umschließen einer Zeichenfolge in ^ bzw. $ Zeilen, die mit dem verwendeten Muster beginnen/enden, abgeglichen. "^ Hallo Leute $" passt zu Zeichenfolgen, die "Hallo Leute" sagen. "^ hallo (. *) people $" stimmt mit Zeichenfolgen überein, die "hallo französische Leute" und "hallo codierende Leute" sagen, aber nicht "hallo codierende Leute ohne Leben"
  • awk - eine Skriptsprache, die von [~ # ~] a [~ # ~] ho programmiert wurde =, [~ # ~] w [~ # ~] einberger und [~ # ~] k [~ # ~] ernighan . Kein sehr origineller Name, aber eine sehr mächtige Sprache, die sich hervorragend für die Textverarbeitung und Datenextraktion eignet.
    • { drucken; gesamt + = $ 1}
      • drucken - Druckt die Zeile, über die gerade iteriert wird
      • total + = $ 1 - initialisiere die Variable total, falls dies noch nicht geschehen ist, und füge den ersten Block hinzu, der durch field separator getrennt ist, in diesem Fall einen space character. Dies kann durch das Flag -F Geändert werden.
      • ;; - Zeilen-/Anweisungsabschluss. Sie können damit mehrere awk -Anweisungen in eine einzelne Zeile einfügen, ähnlich wie beim Beenden von Linux-Befehlszeilenanweisungen. Andernfalls könnten Sie sie in einem mehrzeiligen Objekt haben, das immer noch von {...} umgeben ist.
      • END - Dies bedeutet effektiv, dass awk die angegebenen Aktionen ausführt, bevor es beendet wird.
    • {print "total humsters:" total "Bytes"}
      • print "total humsters:" - erster Teil der ausgegebenen Zeichenfolge
      • total - Die Variable, die die Gesamtsumme der Zeilen enthält, über die iteriert wurde
      • "Bytes" - letzter Teil der gedruckten Zeichenfolge, angeheftet an das Ende der beiden vorherigen Anweisungen
      • offensichtlich sind diese drei Anweisungen wie der erste Teil in {} eingekapselt.

Gehen Sie also ein Beispiel in einem Fall durch, in dem wir die Gesamtzahl der Zip-Dateien in einem Verzeichnis zählen möchten:

du -ac --bytes

836544  ./wp-content/themes/astra.1.8.1.Zip
934364  ./wp-content/themes/astra.2.0.1.Zip
400033  ./wp-content/uploads/2019/09/premium-addons-for-elementor-3.2.9-WJdFQT1mLd3GA81lQEAo.Zip
117351218       ./wp-content/uploads/backwpup-fc5928-temp/2019-05-30_00-47-01_TX6FSKC601.Zip
1192275 ./wp-content/plugins/essential-addons-elementor-master.Zip
170     ./wp-content/plugins/gravityforms/images/doctypes/icon_Zip.gif
1969651 ./wp-content/plugins/acf.Zip
4284    ./wp-content/plugins/types/application/controllers/api/handler/import_from_Zip_file.php

Zwei Komponenten der Ausgabe, Spalte 1 dargestellt durch die numerischen Werte: 836544, 934364 ... usw., und Spalte 2 ist der Pfad der Datei.

Da es jedoch zwei Zeilen gibt, die nicht mit unseren Wünschen übereinstimmen - icon_Zip.gif Und import_from_Zip_file.php - möchten wir diese ausschließen. Da du keine Möglichkeit bietet, rekursiv nach Erweiterung zu filtern (die mir bekannt ist), filtern wir mit grep

grep "Zip$"

Dadurch wird die Ausgabe von du effektiv weitergeleitet und die Zeilen gefiltert, die enden in Zip =, Eliminieren der beiden Datensätze, die wir nicht wollen:

836544  ./wp-content/themes/astra.1.8.1.Zip
934364  ./wp-content/themes/astra.2.0.1.Zip
400033  ./wp-content/uploads/2019/09/premium-addons-for-elementor-3.2.9-WJdFQT1mLd3GA81lQEAo.Zip
117351218       ./wp-content/uploads/backwpup-fc5928-temp/2019-05-30_00-47-01_TX6FSKC601.Zip
1192275 ./wp-content/plugins/essential-addons-elementor-master.Zip
1969651 ./wp-content/plugins/acf.Zip

Dann analysiert awk jede Zeile, wobei die Zahlen in col 1 In $1 Gespeichert werden.

Wir bekommen das:

836544  ./wp-content/themes/astra.1.8.1.Zip
934364  ./wp-content/themes/astra.2.0.1.Zip
400033  ./wp-content/uploads/2019/09/premium-addons-for-elementor-3.2.9-WJdFQT1mLd3GA81lQEAo.Zip
117351218       ./wp-content/uploads/backwpup-fc5928-temp/2019-05-30_00-47-01_TX6FSKC601.Zip
1192275 ./wp-content/plugins/essential-addons-elementor-master.Zip
1969651 ./wp-content/plugins/acf.Zip
total lobsters:  128.339  MB
0
Barry Chapman

Um sowohl die Dir-Ausgabe als auch die Größenberechnung zu erhalten, können Sie ohne Verwendung einer der anderen vorgeschlagenen Optionen Tee (1) und Prozessersetzung verwenden ...

dir | tee >( awk '{ total += $4 }; END { print total }' )
0
Janis