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 pv
do wyświetlenia postępu. Ponieważ to polecenie pozwala tylko monitorować bajty przepływające przez potok, używamy dd
do 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 btrfs
zawsze 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 -a
jest dodawana do domyślnych flag, pv
aby 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ć! :)