Berechnen Sie die durchschnittliche Dateigröße


11

Ich suche einen praktischen Einzeiler für die Berechnung der durchschnittlichen Dateigröße in einem Verzeichnis.

Was ich will ist:

Größe aller Dateien / Anzahl der Dateien im Verzeichnis


Wie in der durchschnittlichen Größe jeder Datei im Verzeichnis? oder die Größe des Verzeichnisses?
Drake Clarris

Die durchschnittliche Größe einer Datei in einem Verzeichnis
Taffer

Antworten:


3

Mit FreeBSD / Mac OS X find, statund awk(nicht gerade ein handliches Einzeiler obwohl):

find -x . -type f -maxdepth 1 -exec sh -c 'stat -f '%z' "${@}"' _ '{}' + | 
LC_ALL=C awk -v pwd="${PWD}" '
   BEGIN{ sum=0; count=0; }
   { sum+=$1; ++count; }
   END{ 
        if (count == 0) exit;
        printf ("number of files: %d\n", count); 
        printf ("average file size in B: %.5f\n", sum/count); 
        printf ("average file size in KB: %.5f\n", (sum/count) / 1024); 
        printf ("average file size in MB: %.5f\n", (sum/count) / (1024*1024)); 
        printf ("directory: %s\n", pwd); 
   }
'

Beachten Sie, dass in -v var=value, awkwird ANSI - C - Sequenzen erweitern , wie \n, \r... Während Schalen Export zu tun PWD, so dass Sie verwenden können , ENVIRON["PWD"]in awkdenen diese Art von Problem für Verzeichnisse haben Schrägstriche in ihrem Namen.
Stéphane Chazelas

Wenn Sie nur die durchschnittliche Größe in Bytes benötigen, können Sie verwenden find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'.
Lri

11

Mit GNU finden:

find . -type f -printf '%s\n' | awk '{s+=$0}
  END {printf "Count: %u\nAverage size: %.2f\n", NR, s/NR}'

Oder für die Festplattennutzung:

find . -type f -printf '%k\n' | awk '{s+=$0}
  END {printf "Count: %u\nAverage size: %.2f\n", NR, s*1024/NR}'

Beachten Sie, dass bei mehreren Hardlinks derselben Datei die Festplattennutzung mehrmals gezählt wird.

Das Obige zählt nur reguläre Dateien, keine Symlinks oder Verzeichnisse oder andere spezielle Dateien. Es enthält versteckte Dateien.

Das selbe mit zsh Builtins:

zmodload -i zsh/stat
count() {zstat -Hs -- $REPLY; ((size+=$s[size], count++, 0))}
size=0 count=0
**/*(oNDN.+count)
print -f "Count: %s\nAverage size: %.2f\n" $count $(($size./count))

3

Eine vereinfachende Lösung in einer Zeile:

ls -Rl -- "$DIR" | awk 'BEGIN{sum=0;count=0};/^-/{sum+=$5;++count};END{print sum/count}'

Es enthält einen syntaktischen Cheat, der nur lsAusgabezeilen berücksichtigt , die mit '-' beginnen und Daten für reguläre Dateien darstellen sollten.


2

Für nur Dateien in einem Verzeichnis werden Unterverzeichnisse ignoriert:

expr $(du -Ss | cut -f1) / $(find /path/to/dir -maxdepth 1 -type f | wc -l)

Oder um alle Dateien einschließlich der Dateien in Unterverzeichnissen zu zählen:

expr $(du -s | cut -f1) / $(find /path/to/dir -type f | wc -l)

Ich möchte Unterverzeichnisse nicht ignorieren.
Taffer

nett. Fügen Sie einfach -k zu du invocation hinzu, um das Ergebnis in 1024 Byte (kb) anstelle von 512 Byte (Standardgröße eines Dateiblocks) zu erhalten.
Olivier Dulac

2
du -saddiert die Festplattennutzung (nicht die Größe) aller Dateien und Verzeichnisse und anderer nicht regulärer Dateien , ausgenommen zusätzliche feste Links zu derselben Datei, während findalle regulären Dateien gezählt werden. Außerdem werden Dateinamen mit Zeilenumbrüchen mehrmals gezählt. du -Sist GNU-spezifisch. du -smeldet je nach Betriebssystem Sektoren oder Kilobyte.
Stéphane Chazelas

Wie immer @StephaneChazelas überrascht mich Ihr Wissen über Linux / Unix und zeigt mir, wie schmutzig meine schnellen und schmutzigen Lösungen sind. Wie lange benutzt du schon Linux / Unix?
Drake Clarris

Die Antwort ist schrecklich falsch und sollte gelöscht werden. Erklärt von Stephane.
Acumenus
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.