Mam kilka dużych plików, które chciałbym skompresować. Mogę to zrobić na przykład
tar cvfj big-files.tar.bz2 folder-with-big-files
Problem polega na tym, że nie widzę żadnego postępu, więc nie mam pojęcia, ile to zajmie ani nic takiego. Używając v
, mogę przynajmniej zobaczyć, kiedy każdy plik jest ukończony, ale gdy plików jest niewiele i jest to duże, nie jest to najbardziej pomocne.
Czy istnieje sposób, aby uzyskać tar, aby pokazać bardziej szczegółowe postępy? Na przykład procent ukończenia, pasek postępu lub szacowany pozostały czas lub coś w tym rodzaju. Dla każdego pojedynczego pliku lub wszystkich lub obu.
pv $FILE.tgz | tar xzf - -C $DEST_DIR
tar cf - /folder-with-big-files -P | pv -s $[$(du -sk /folder-with-big-files | awk '{print $1}') * 1024] | gzip > big-files.tar.gz
Bez tej zmiany dostawałem-bash: syntax error near unexpected token ')'
Możesz to zrobić za pomocą pv . Aby poprawnie zgłosić postęp,
pv
musisz wiedzieć, ile bajtów na niego rzucasz. Pierwszym krokiem jest więc obliczenie wielkości (w kilobajtach). Możesz także całkowicie upuścić pasek postępu i po prostupv
powiedzieć ci, ile bajtów widział; zgłosiłoby „zrobione tyle i tak szybko”.I wtedy:
źródło
pv
wydaje się, że nie jest dostarczany z Mac OS X, ale wypróbuje to, gdy będę mieć komputer z MacPorts. Czy mógłbyś jednak wyjaśnić, co tam robisz? Nie jestem pewien, co dokładnie robi pierwsza linia.SIZE=$(($SIZE * 1000 / 1024))
- Nie wiem, czy to dziwactwo na mojej konkretnej platformie, więc nie dodam go do odpowiedzi:du
zwraca rozmiar, w którym 1 kb = 1024 bajty, podczas gdypv
wydaje się, że oczekuje 1 kb = 1000 bajty. (Jestem na Ubuntu 10.04)du
o użycie preferowanego rozmiaru bloku, np.du -s --block-size=1000
lub po prostu pracować z zwykłymi bajtami, np. upuścić plikik
z wywołańdu
ipv
. Mimo to, chciałbym oczekiwać zarówno w użyciu1024
, chyba powiedziano inaczej, np--si
włączeniudu
, na przykład.du -sb
ipv -s
bez żadnego modyfikatora). to powinno zakończyć wszystkie zamieszanie.lepszy pasek postępu ..
źródło
Sprawdź opcje
--checkpoint
i--checkpoint-action
na stronie informacji o tar (tak jak w przypadku mojej dystrybucji opis tych opcji nie jest zawarty na stronie podręcznika → RTFI).Zobacz https://www.gnu.org/software/tar/manual/html_section/tar_26.html
Za pomocą tych (i być może funkcji napisania własnego polecenia punktu kontrolnego) możesz obliczyć procent…
źródło
tar
specyficzny dla GNU .Zainspirowany odpowiedzią pomocnika
Innym sposobem jest użycie
tar
opcji natywnychwynik jest jak
kompletny przykład tutaj
źródło
Używanie tylko smoły
tar
ma opcję (od wersji 1.11) do drukowania informacji o statusie sygnałów za pomocą--totals=$SIGNO
np .:Total bytes written: [...]
Informacja zostanie wydrukowany na każdym sygnale USR1, np:Źródło:
źródło
Właśnie zauważyłem komentarz na temat MacOS i chociaż myślę, że rozwiązanie z @akira (i pv) jest znacznie fajniejsze, pomyślałem, że ścigam przeczucie i szybkie zagranie w moim MacOS z tar i wysyłając mu sygnał SIGINFO. Co zabawne, zadziałało :) jeśli korzystasz z systemu podobnego do BSD, powinno to działać, ale na Linux-ie może być konieczne wysłanie SIGUSR1 i / lub
tar
może nie działać w ten sam sposób.Wadą jest to, że zapewni ci tylko wyjście (na standardowym wyjściu) pokazujące, jak daleko jest do bieżącego pliku, ponieważ domyślam się, że nie ma pojęcia o tym, jak duży jest strumień danych.
Tak więc, alternatywnym podejściem byłoby odpalenie tar i okresowe wysyłanie jej SIGINFO w dowolnym momencie, aby dowiedzieć się, jak daleko się zaszła. Jak to zrobić?
Podejście ad hoc, ręczne
Jeśli chcesz mieć możliwość sprawdzania statusu na zasadzie ad hoc, możesz nacisnąć
control-T
(jak wspomniano Brian Swift) w odpowiednim oknie, które prześle sygnał SIGINFO. Jednym z problemów jest to, że przesyła to do całego łańcucha, wierzę, więc jeśli robisz:Zobaczysz także raport bzip2 o jego statusie wraz z tar:
Działa to dobrze, jeśli chcesz po prostu sprawdzić,
tar
czy Twój bieg jest zablokowany lub po prostu wolny. W tym przypadku prawdopodobnie nie musisz się zbytnio przejmować problemami z formatowaniem, ponieważ jest to tylko szybkie sprawdzenie ...Rodzaj zautomatyzowanego podejścia
Jeśli wiesz, że zajmie to trochę czasu, ale potrzebujesz czegoś w rodzaju wskaźnika postępu, alternatywą byłoby odpalenie procesu tar, a na innym terminalu ustalenie jego PID, a następnie wrzucenie go do skryptu, który po prostu wielokrotnie wysyła sygnał . Na przykład, jeśli masz następujący skryptlet (i wywołujesz go jak powiedzmy
script.sh PID-to-signal interval-to-signal-at
):Jeśli wywołasz to w ten sposób, ponieważ celujesz tylko
tar
, uzyskasz bardziej podobny wynikco przyznaję, jest dość ładne.
Last but not least - moje skrypty są trochę zardzewiałe, więc jeśli ktoś chce wejść i wyczyścić / naprawić / poprawić kod, idź po swoje życie :)
źródło
tar
w wierszu poleceń, wpisaniecontrol-T
wyśle mu SIGINFO. Gdyby to było w skrypcie, byłoby to zrobione zkill -INFO pid
control-T
, najwyraźniej przyzwyczaiłem się do spamowania zbyt wieloma oknami konsoli dla własnego dobra.kill -l
Zainspirowany odpowiedzią Noah Spurrier
Źródło
źródło
Jeśli znasz numer pliku zamiast całkowitego rozmiaru wszystkich:
alternatywą (mniej dokładne, ale odpowiednie) jest użycie opcji -l i przesłanie w potoku unix nazw plików zamiast zawartości danych.
Miejmy 12345 plików w moim katalogu , polecenie to:
możesz znać taką wartość z góry (ze względu na swój przypadek użycia) lub użyć polecenia, np. find + wc, aby ją odkryć:
źródło
tar cfvz ~/mytarfile.tgz . | pv -s $(find . | wc -l) -l > /dev/null
. Czy Ci to pasuje?Metoda oparta na tqdm :
źródło
W systemie macOS najpierw upewnij się, że masz wszystkie dostępne polecenia i zainstaluj brakujące (np.
pv
) Za pomocą brew .Jeśli chcesz tylko
tar
bez kompresji , skorzystaj z:Jeśli chcesz skompresować , skorzystaj z:
źródło
Oto kilka kopii zapasowych prometheus (dane metryk) na Debian / buster AMD64:
Anulowano to zadanie, ponieważ nie było wystarczającej ilości miejsca na dysku.
Eksperymentowanie z
zstd
kompresorem dotar
monitorowania postępu za pomocąpv
:źródło