Zastanawiałem się także, kiedy skończy się długotrwałe usuwanie, więc wymyśliłem ten mały fragment kodu powłoki:
get_bytes() {
btrfs device usage --raw /mnt/data | egrep -- '-[0-9]+' | sed -E 's/[^0-9]+([0-9]+)/\1/'
}
prev=$(get_bytes)
while [ 1 ]; do
current=$(get_bytes)
diff=$((current-prev))
if [ "$diff" -gt 0 ]; then
dd if=/dev/zero iflag=count_bytes count="$diff" 2>/dev/null
fi
prev="$current"
sleep 1
done | pv -petraW -s $(get_bytes) >/dev/null
To da ci fajny pasek postępu taki jak ten:
0:13:54 [0,00 B/s] [16,0MiB/s] [> ] 1% ETA 19:23:19
Ogólnym pomysłem jest użycie pvdo wyświetlenia postępu. Ponieważ to polecenie pozwala tylko monitorować bajty przepływające przez potok, używamy dddo generowania odpowiedniej liczby zer i przesyłania ich do potoku pv.
Zaletą tej metody jest to, że masz ładny pasek postępu. Ponieważ jednak wydaje się, że btrfszawsze usuwa dane jeden GB na raz, potrzeba czasu, zanim można zaobserwować nową różnicę w rozmiarach bajtów.
Aby rozwiązać ten problem, flaga -ajest dodawana do domyślnych flag, pvaby wyświetlać średnią szybkość transmisji (ponieważ normalna bieżąca szybkość transmisji będzie wynosić 0 przez większość czasu).
Zdaję sobie sprawę, że nie jest to najlepsze rozwiązanie, ale najlepsze, jakie mogłem wymyślić. Jeśli ktoś ma pomysły na ulepszenia, daj mi znać! :)