it-swarm.com.de

Liefert die Gesamtgröße einer Liste von Dateien in UNIX

Ich möchte einen find-Befehl ausführen, der eine bestimmte Liste von Dateien findet und dann diese Liste von Dateien durchläuft, um einige Operationen auszuführen. Ich möchte auch die Gesamtgröße aller Dateien in dieser Liste ermitteln.

Ich möchte die Liste der Dateien zuerst erstellen und dann die anderen Operationen ausführen. Gibt es eine einfache Möglichkeit, nur die Gesamtgröße aller Dateien in der Liste anzugeben?

Im Wesentlichen versuche ich im folgenden Code-Snippet einen Einzeiler für die Variable 'total_size' zu finden:

#!/bin/bash
loc_to_look='/foo/bar/location'

file_list=$(find $loc_to_look -type f -name "*.dat" -size +100M)

total_size=???

echo 'total size of all files is: '$total_size

for file in $file_list; do
         # do a bunch of operations
done
22
HotDogCannon

Sie sollten einfach $file_list an du übergeben können:

du -ch $file_list | tail -1 | cut -f 1

du Optionen:

  • -c Anzeige einer Summe
  • -h lesbar (d. h. 17M)

du gibt einen Eintrag für jede Datei aus, gefolgt von der Summe (mit -c). Daher verwenden wir tail -1, um nur die letzte Zeile zu trimmen, und cut -f 1, um diese Zeile nur auf die erste Spalte zu trimmen.

36
sanmiguel

Die hier erläuterten Methoden haben einen versteckten Fehler. Wenn die Dateiliste lang ist, überschreitet sie die Begrenzung der Shell-Befehlsgröße. Verwenden Sie dieses besser mit du:

find <some_directories> <filters> -print0 | du <options> --files0-from=- --total -s|tail -1

find erzeugt eine Datei mit null Endung, du nimmt sie aus stdin und zählt Dies ist unabhängig von Shell-Befehlsgrößenlimit . Natürlich können Sie einige Schalter hinzufügen, um die logische Dateigröße zu erhalten, weil standardmäßig du Ihnen gesagt, wie viel Speicherplatz physisch benötigt.

Aber ich denke, es ist keine Frage für Programmierer, sondern für Unix-Admins :) Dann ist das für Stackoverflow kein Thema.

17
Znik

Dieser Code summiert alle Bytes aus den vertrauenswürdigen ls für alle Dateien (es werden alle Verzeichnisse ausgeschlossen ... anscheinend sind sie 8 kb pro Ordner/Verzeichnis).

cd /; find -type f -exec ls -s \; | awk '{sum+=$1;} END {print sum/1000;}'

Hinweis: Als root ausführen. Ergebnis in Megabytes.

2

ls -l | tr -s ' ' | cut -d ' ' -f <field number> ist etwas, was ich häufig benutze. 

Das fünfte Feld ist die Größe. Setzen Sie diesen Befehl in eine for-Schleife und fügen Sie die Größe einem Akkumulator hinzu. Sie erhalten dann die Gesamtgröße aller Dateien in einem Verzeichnis. Leichter als AWK zu lernen. Außerdem können Sie im Befehlssubjektteil grep einschränken, wonach Sie suchen (^ - für Dateien usw.).

total=0

for size in $(ls -l | tr -s ' ' | cut -d ' ' -f 5) ; do
  total=$(( ${total} + ${size} ))
done

echo ${total}
0
Richard