Я часто нахожу скрипты оболочки несколько неуклюжими, поэтому я написал скрипт на Python, чтобы сделать это:
import os
import sys
dir = "."
if len(sys.argv) > 1:
dir=sys.argv[1]
files = [os.path.join(f[0], x) for f in os.walk(dir) for x in f[2]]
filesWithSizes = [(f, os.stat(f).st_size) for f in files if os.path.exists(f)]
sizes = [f[1] for f in filesWithSizes]
maxSize = max(sizes)
minSize = min(sizes)
avgSize = 0
if len(sizes) > 0:
avgSize = sum(sizes) / len(sizes)
maxFiles = [f[0] for f in filesWithSizes if f[1] == maxSize]
minFiles = [f[0] for f in filesWithSizes if f[1] == minSize]
print("Minimum file size: {}".format(minSize))
for f in minFiles:
print(" " + f)
print("Maximum file size: {}".format(maxSize))
for f in maxFiles:
print(" " + f)
print("Average file size: {}".format(avgSize))
В системе GNU:
#! /bin/sh -
find "$1" -type f -printf '%s\0 %p\n\0' |
awk -vRS='\0' '
{getline file}
{n++; sum += $0; files[$0] = files[$0] file}
$0 < min || n == 1 {min = $0}
$0 > max || n == 1 {max = $0}
END {
if (n)
printf "min: %d\n%s\nmax: %d\n%s\naverage: %.17g\n", \
min, files[min], max, files[max], sum/n
}'
Это касается размера файла (здесь обычные файлы только с -типом f
]), в отличие от использования диска. Для использования диска используйте % k
или % b
вместо % s
в аргументе find
-printf
.
Предполагается, что $ 1
не похож на параметр или предикат find
(например, -L
, !
, (
, -name
...).
$ that-script /usr/bin
min: 30
/usr/bin/rgrep
/usr/bin/xlinks2
max: 11634832
/usr/bin/doxygen
average: 170653.62570735652