Sly_tom_cat, с вашего позволения, немного переделал.
#!/usr/bin/env python3
import subprocess, os, re, sys
try:
path = sys.argv[1]
except IndexError:
path = os.getcwd()
subprocess.call([r"find {path} -xdev -type f -exec filefrag '{{}}' + | sed -e 's/^\(.*\): \(.*\) extent.* found$/\2 \1/' | sort -nr > /tmp/frag.log".format(path=path)],
shell=True)
print(path)
total = 0
totalf = 0
fragmented = 0
frags = 0
cnt = [0, 0, 0, 0]
with open('/tmp/frag.log', 'rt', newline='\n') as f:
for line in f:
totalf += 1
fr, fn = re.findall(r'(\d+) (.*)', line)[0]
fr = int(fr)
if fr > 0:
total += 1
frags += fr
if fr > 1:
fragmented += 1
if fr == 2:
cnt[0] += 1;
elif fr <= 10:
cnt[1] += 1;
elif fr <= 100:
cnt[2] += 1;
else:
cnt[3] += 1;
if fragmented:
cnt = [c/fragmented*100 for c in cnt]
exfrags = frags - total
tot = 'Total: %d files (%d not empty) and %d fragments\n' % (totalf, total, frags)
tot += ('Totally %d fragments in %d fragmented files\n' % (exfrags, fragmented) if fragmented else '')
tot += 'Fragmentation factor by files {fragmented/total}: %0.2f%%\n' % (fragmented / totalf * 100)
tot += 'Fragmentation factor by fragments {(total_fragments - total)/total}: %0.2f%%\n' % (exfrags / total * 100)
tot += ('\n 2 fragments: %d%%\n 3-10 fragments: %d%%\n11-100 fragments: %d%%\n > 100 fragments: %d%%'
% (cnt[0], cnt[1], cnt[2], cnt[3]) if fragmented else '')
print(tot)
А в /usr/local/bin создал файл btrfs.frag:
#!/bin/bash
exec python3 /путь/скрипт.py $1
Теперь можно вызывать проверку из терминала, не таская за собой скрипт по папкам
btrfs.frag /путь
Если вызвать не указывая путь - будет браться текущий каталог в терминале. Я думал, будет браться директория со скриптом, но получилось даже лучше.
P.S. А картина, да. Печальная. И это с ключем autodefrag.
UPD. Немного изменил, чтобы выводил путь правильно, если передан отличный от текущего каталога.
UPD2. Все сломал, пока редактировал пост. Поправил.