informacje o postępach poprzez pv do kopiowania katalogu

14

Muszę skopiować bardzo duży katalog (tutaj mówię w terabajtach) i chcę monitorować postęp.

Odkryłem, że pvjest to przydatne narzędzie, ale jak mogę go używać do rekurencyjnego kopiowania katalogów? ( pv src > dstnie działa, ponieważ są katalogami)

PS: działający na systemie OS X Mountain Lion pvzostał zainstalowany z portów Mac

FP
źródło

Odpowiedzi:

21

Posługiwać się rsync --progress [SRC] [DST]

Sprawdź man rsyncstronę, ponieważ ma wiele bardzo przydatnych opcji. -aarchiwizacja to dobry początek, ale zależy to od twoich dokładnych wymagań.

Kopiowanie przez potok niepotrzebnie spowalnia proces kopiowania, szczególnie jeśli jest oparty na plikach.

jippie
źródło
Dlaczego kopiowanie przez potok spowalnia proces? Buforowanie zapewniane przez potoki i wielozadaniowość związana z potokami może pomóc w sprawach, które powiedziałbym. (a rsync jest wieloprocesowy i używa potoków wewnętrznie IIRC). Co to jest proces kopiowania, który nie jest oparty na plikach?
Stéphane Chazelas,
Bash jest wygodny, ale nie szybki. Zwłaszcza podczas przesyłania jednego polecenia do drugiego.
jippie
@StephaneChazelas: Ponieważ bufor rury ma tylko 8 KB. Program taki jak rsync może chcieć użyć znacznie większego bufora wewnętrznego.
Zan Lynx,
10

Można użyć taralbo paxalbo cpio:

mkdir -p dst &&
  (cd src && tar cf - .) | pv -trb | (cd dst && tar xpf -)
Stéphane Chazelas
źródło
1
Dodatkowo, można dodać vdo tarpolecenia, aby zobaczyć nazwy plików.
peterph
Spowoduje to spakowanie folderu źródłowego przed wykonaniem kopii, prawda? Mój folder ma rozmiar 5 TB, więc nie jestem pewien, czy to najlepszy sposób, aby to zrobić? Naprawdę lubię używać pv, ponieważ pokazuje on naprawdę dobry status postępu, jakaś rada, proszę?
Tak
@Tak, nie, nic nie zipuje, ponieważ nie ma kompresji. tar cf -wysyła strumień zawierający pliki i ich metadane, który jest przekazywany przez potok do pv, który przekazuje go nietknięty drugiemu tarpodczas drukowania wskazania postępu, a drugi tarwyodrębnia dane z tego strumienia. Wszystkie trzy polecenia działają jednocześnie i przetwarzają dane, tak jak są, nic nie jest przechowywane na dysku, nic nie jest przechowywane w pamięci oprócz buforów potoków i wewnętrznych buforów poleceń, które wynoszą zaledwie kilka kilobajtów.
Stéphane Chazelas
@ StéphaneChazelas Dzięki za komentarz. Wypróbowałem to i działa, jedyne, że pasek postępu nie pokazuje oczekiwanego procentu, który ciągle przesuwa się od lewej do prawej. Masz pomysł, dlaczego? Użyłem pv z tymi parametrami -petra, która zwykle pokazuje pasek postępu, w którym pasek był zapełniany aż do końca. Poparłem również twoją odpowiedź.
Tak
@Tak, pvnie ma sposobu, aby dowiedzieć się, ile danych jest do przesłania. Jeśli masz oszacowanie tej kwoty, możesz przekazać ją do niej z -sopcją (GNU du -sb srcdałoby ci dobre przybliżenie, jeśli pliki są wystarczająco duże)
Stéphane Chazelas
2

Smoła.

tar -cf - /var/log/ | pv | tar -C . -x

Przykład:

# tar -cf - /var/log/ | pv | tar -C . -x
tar: Removing leading `/' from member names
58MB 0:00:05 [ 2.2MB/s] [                   <=> 
Anomalny Awe
źródło
1

Oto niektóre polecenia do kopiowania katalogów z informacjami o postępie.


Jeśli jest wiele małych plików:

cp -av sourcedir targetdir | pv -l -s filecount > logfile

Spowoduje to zgłoszenie postępów na podstawie liczby skopiowanych plików.

Możesz przekierować do, /dev/nulljeśli nie potrzebujesz logfile.

Użyj następującego polecenia, aby uzyskać filecount:

find sourcedir | wc -l

Jeśli jest kilka dużych plików:

tar c sourcedir | pv -s size | tar x -C targetdir

Spowoduje to zgłoszenie postępu na podstawie skopiowanych bajtów.

targetdir musi istnieć.

Użyj następującego polecenia, aby uzyskać size:

du -sh sourcedir

Jeśli chcesz użyć rsync:

rsync -ai sourcedir/ targetdir/ | pv -l -s filecount > logfile

Zdobądź filecountjak pokazano powyżej.

Jeśli kopiujesz w tym samym systemie, rsync -ajest praktycznie taki sam jak cp -a. Zalety rsync polegają na kopiowaniu przez sieć lub aktualizowaniu (lub porównywaniu) poprzedniej kopii.

Zobacz tutaj po więcej szczegółów:

lesmana
źródło
0

Możesz wykonać du -b /directory/zarówno na źródle, jak i miejscu docelowym, podczas gdy normalne polecenie kopiowania jest w toku, i porównać oba. Jest to tak samo skuteczne i nie spowalnia procesu kopiowania, przepychając go przez potok.

Apostoł
źródło
-1
find source-dir -print0 | xargs -0 -I % pv % > dest-dir/%
Christopher Hilla
źródło
3
Wyjaśnij solutipon trasy, będziesz chciał, żeby OP mógł ją
wypróbować