Как найти максимальный и минимальный размер файла наряду с их путем в каталоге

[12255]/dev/sdb[1128842] - имя блочного устройства. Изменение разрешения на [1128843]/dev/sdb[1128844] не повлияет на файловую систему на [1128845]/dev/sdb[1128846].[12256] Используйте [1128847]mount[1128848] для получения списка монтируемых носителей и точек монтирования.[12257] Используйте [1128849]chmod[1128850] для изменения разрешений в точке монтирования.[12258], например. В этом случае [1128853]/run/mount/pioneeraxon/disk1[1128854] является точкой монтирования для [1128855]/dev/sdb1[1128856]. В [1128857] /run/mount/pioneeraxon/disk1[1128858] необходимо изменить разрешения.[1128352].
1
19.05.2015, 10:30
2 ответа

Я часто нахожу скрипты оболочки несколько неуклюжими, поэтому я написал скрипт на 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))
1
27.01.2020, 23:16

В системе 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
4
27.01.2020, 23:16

Теги

Похожие вопросы