Summe der Dateigrößen in der Verzeichnisliste anzeigen

71

Der Windows- dirBefehl zum Auflisten von Verzeichnissen enthält am Ende eine Zeile, die den gesamten von den aufgelisteten Dateien belegten Speicherplatz angibt. dir *.exeZeigt zum Beispiel alle .exeDateien im aktuellen Verzeichnis, ihre Größe und die Gesamtsumme ihrer Größe an. Ich würde gerne eine ähnliche Funktionalität mit meinem dirAlias ​​in Bash haben, aber ich bin mir nicht sicher, wie ich genau vorgehen soll.

Derzeit habe ich alias dir='ls -FaGl'in meiner .bash_profile, zeigt

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. Antworten auf diese Frage :

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

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

MattDMo
quelle
5
Warum ls -lhhilft dir das nicht? Es gibt die Gesamtsumme oben aus. Sie können auch ausführen du -sh *.exe, um Informationen zur Speicherplatznutzung in lesbarer Form abzurufen.
Bagavadhar
@ashwin Ich weiß nicht, was die "Summe" druckt ls -lh, aber es hängt nicht immer damit zusammen, was die awkunten stehenden Skripte berechnen oder was ich von Hand addiere. Manchmal liegt es nahe an der Anzahl der KB an Dateien im Verzeichnis, aber es scheint nicht die zugewiesenen Größen der Unterverzeichnisse zu berücksichtigen. Ich wäre Ihnen dankbar, wenn Sie mir erklären könnten, was genau diese Zahl ist ...
MattDMo
Sehen Sie, ob meine Antwort unten für Sie funktioniert
Bagavadhar
1
ls -lhzeigt nicht die Gesamtgröße eines
Verzeichnisses an,

Antworten:

25

Die folgende Funktion erledigt die meisten Ihrer Anfragen:

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

... aber es wird dir nicht das geben, wonach du fragst dir -R *.jpg *.tif, denn so ls -Rfunktioniert es nicht. Vielleicht möchten Sie mit dem findDienstprogramm dafür herumspielen.


quelle
1
Dies ist der Fall, wenn Sie im Wesentlichen die Inhaltsgröße jeder Datei und NICHT die Größe der Datei auf der Festplatte suchen . Diese Unterscheidung ist bei sehr kleinen Dateien ausgeprägter. In meiner Distribution wird jeder Datei Speicherplatz auf der Festplatte in 4-KB-Blöcken zugewiesen (so dass eine 300-Byte-Datei immer noch 4 KB auf einer Festplatte belegt, wie vom Befehl du gemeldet). Angesichts dessen, wonach das OP gesucht hat, "wie viel Speicherplatz jede Datei belegt", ist du der richtige Weg, dies zu tun.
Jon V
1
dirist bereits der Name eines populären GNU-Coreutils, ich würde eine solche Funktion lieber nicht nennen.
Dessert
Bitte korrigieren Sie das Problem so, dass es sowohl unter Linux als auch unter OS-S und Ihrem "-a" include "funktioniert." und "..", was nicht gut ist:) Hier ist der feste Befehl: dir () {ls -FAl "$ {@}" | awk '{total + = $ 5; drucken }; END {print "total:" total} '; }
Dmitry Shevkoplyas
148

Dafü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. -hist eine Erweiterung, um die Größe in ein benutzerfreundliches Format zu konvertieren. -aSie gibt die "scheinbare" Größe (Dateigröße anstelle der Festplattennutzung) an und -cgibt am Ende eine Gesamtsumme an.

Pete Cornell
quelle
12
Ja, du funktioniert gut. Sie können die Option -c (wie --total) verwenden, um eine Gesamtsumme am Ende der Liste zu erhalten.
MikeB
6
Beachten Sie, dass dudie Festplattennutzung angegeben wird, nicht die Summe der Dateigrößen.
Stéphane Chazelas
7
du -hsummiert nicht die Größe der übergebenen Dateien. du -h *.sozeigt die Größe jeder Datei, aber nicht die Summe. Ich denke, was Sie hier wollen, ist du -hc *.so(oder sogar du -hc *.so | tail -1). Aber er will natürlich auch die Verzeichnisliste.
Eingeschränktes Sühnopfer
1
Dieser Befehl funktioniert nur mit einer kurzen Liste von Dateien. Sehen Sie, was passiert, wenn Sie 850000 Dateien in einem Verzeichnis haben !!!
Hamid FzM
3
! -abedeutet --all. Ziehen Sie es in Betracht, stattdessen--apparent-size
Arnauld VM
17

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

Dadurch wird eine einzelne Zeile mit der Speichernutzung generiert.

Mani Deepak
quelle
15
du -hs directorywenn du nur die Summe willst.
Stéphane Chazelas
8

Gib einfach die aktuelle Zeile aus, in der du die Summe von:

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

mit perl:

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

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

Ingopingo
quelle
1

Das Hinzufügen des Folgenden zu .bash_profile oder .bashrc funktioniert für mich.

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

Wenn ich jetzt eine dir * .mp3 mache, dann rekursiv und druckt am Ende total. Sie können steuern, wie viel Tiefe Sie möchten, indem Sie der Suche einen maxdepth-Parameter hinzufügen. Ich weiß, zweimal zu finden ist keine sehr effektive Idee. Aber ich könnte mir keinen besseren Weg vorstellen. Zumindest wird es die Arbeit erledigt.

Bagavadhar
quelle
1

Die Verwendung von du und einer awk- Anweisung wie der oben genannten liefert das, wonach Sie suchen.

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

Dies listet alle Dateien im Ordner Downloads des Benutzers abc auf, die mit .jpg enden, und gibt die Summe aller dieser Dateien am Ende der Auflistung aus.

user3085123
quelle
0

Um sowohl Dir-Ausgabe als auch Größenberechnung zu erhalten, ohne eine der anderen vorgeschlagenen Optionen zu verwenden, können Sie tee (1) verwenden und Substitution verarbeiten ...

dir | tee >( awk '{ total += $4 }; END { print total }' )
Janis
quelle
Keine Notwendigkeit tee, nurdir | awk '{print; total += $4}; END {print total}'
Stéphane Chazelas
0
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'
Zähmer Mansour
quelle
3
Nein. Erstens ist es keine Antwort, nur einen Befehl zu geben. Zweitens, wenn Sie sich die Mühe gemacht hätten, die ganze Frage, die anderen Antworten und meine Kommentare zu lesen, hätten Sie gesehen, dass dies NICHT das ist, was ich will.
MattDMO
Das ist das erste Suchergebnis für die Google-Suche linux sum human readable sizesund genau das, wonach ich suche.
Sridhar Sarnobat
-2
du * | awk -v sum=0 '{print sum+=$1}' | tail -1
Jason
quelle
Das tut nicht das, wonach ich gefragt habe.
MattDMo