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
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
Antworten:
Mit FreeBSD / Mac OS X find
, stat
und 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);
}
'
-v var=value
, awk
wird ANSI - C - Sequenzen erweitern , wie \n
, \r
... Während Schalen Export zu tun PWD
, so dass Sie verwenden können , ENVIRON["PWD"]
in awk
denen diese Art von Problem für Verzeichnisse haben Schrägstriche in ihrem Namen.
find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'
.
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))
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 ls
Ausgabezeilen berücksichtigt , die mit '-' beginnen und Daten für reguläre Dateien darstellen sollten.
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)
du -s
addiert 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 find
alle regulären Dateien gezählt werden. Außerdem werden Dateinamen mit Zeilenumbrüchen mehrmals gezählt. du -S
ist GNU-spezifisch. du -s
meldet je nach Betriebssystem Sektoren oder Kilobyte.