Czy można zobaczyć szybkość CP i procent skopiowane?

251

Mam problemy z kopiowaniem dużych plików za pomocą nautilusa (blokuje się). Muszę skopiować, używając cp. Chciałbym wiedzieć, czy są jakieś parametry, które pokazują% skopiowane, a także prędkość transferu.

yzT
źródło
39
Możesz użyć rsynczamiast cp. Ma --progressopcję.
frostschutz
2
Midnight Commanderdziała również dobrze i ma ładny tekstowy interfejs użytkownika z paskami postępu, ale może nie zostać zainstalowany. Spróbuj mcw wierszu polecenia. Oczywiście nie jest cp.
CVn
3
Używanie rsyncz --progresswłaśnie sprawiło, że zrozumiałem, co się dzieje. Utknie, gdy osiągnie 100%, a następnie potrwa kilka minut. Myślę, że to samo dzieje się z nautilus. W każdym razie jest to już inne pytanie, więc najlepszą odpowiedzią na to pytanie jest: rsync --progresspokazuje rozmiar,%, szybkość i czas, który upłynął.
yzT
2
Jednym z problemów z rsync jest to, że działa wolniej niż czysta kopia. Na moim dużym serwerze różnica wynosi odpowiednio 60 MB / si 300 MB / s.
pdwalker
1
@pdwalker nawet z -Wopcją? na wszystkich moich hostach rsyncjest prawie tak szybki jak cp... tak blisko, że regularnie używam rsynczamiast cp.
Skaperen

Odpowiedzi:

193

rsyncma flagę o nazwie, progress2która pokazuje ogólny procent:

rsync --info=progress2 source dest
yzT
źródło
5
--info = progress2 wciąż nie przeszedł do domyślnego repozytorium, a oto 2015. Wydaje się, że to dobry pomysł.
Lonniebiz
1
--info=progress2w końcu włączone version 3.1.0 protocol version 31. Może mógłbyś edytować swoją odpowiedź, yzT.
Sopalajo de Arrierez
1
Zauważyłem, --info=progress2że rsync płonie szybko! 200 MB / s, podczas gdy Windows nie przekracza 90 MB / s!
ReneFroger
1
@ReneFroger, chociaż może to być rzeczywista prędkość (w zależności od urządzenia), często w Linuksie ta szybkość jest naprawdę nieprawdziwa, a po zakończeniu kopiowania system nadal zapisuje na urządzeniu, w przeciwieństwie do systemu Windows, w którym można wysunąć urządzenie prawie natychmiast. Jeśli kopiujesz duże pliki, możesz zauważyć, jak zaczyna się ono z tak dużą prędkością, ale potem spada do standardowego.
yzT
7
działało dla mnie tylko z --progress. wersja rsync 3.0.9
adrianTNT
103

Jeśli dopuścisz inne narzędzia, cpto z pewnością jest to możliwe. Do jednego pliku możesz użyć pv. To małe narzędzie zapewniające ładne statystyki.

pv inputfile > outputfile

Jeśli masz wiele plików lub katalogów, możesz użyć tar:

tar c sourceDirectory | pv | tar x -C destinationDirectory

Możesz owinąć go funkcją powłoki. Mniej pisać, a semantyka zbliżona do semantyki cp. Oto bardzo prosta (i nie odporna na błędy!) Funkcja:

cpstat () {
  tar c "$1" | pv | tar x -C "$2"
}

Zauważ, że niektóre wersje tarnie obsługują wyżej wspomnianej składni (np. Solaris tar) i musisz użyć następującego wariantu:

cpstat () {
  tar cf - "$1" | pv | (cd "$2";tar xf -)
}

Nazywasz to tak

cpstat sourceDirectory destinationDirectory

Możesz go jeszcze bardziej ulepszyć, aby pvoszacować pozostały czas.

Innym rozwiązaniem (jak wspomniano w komentarzu frostschutz) jest użycie rsync z --progressopcją:

rsync --progress -a sourceDirectory destinationDirectory
Marco
źródło
1
cpstat idzie do pastebin =)
Matt
7
To da ci szybkość transferu, ale nie ETA, ponieważ pvnie wie, ile danych będzie przechodzić przez potok. Możesz to określić za pomocą -s. Np najpierw zrobić du -sh sourceDirectory, aby uzyskać (szorstki) pomysł, a następnie przekazać je pvw następujący sposób: pv -s 100m.
Jan Fabry
1
--info = progress2 daje statystyki postępu na poziomie katalogu.
AlexLordThorsen
vbuf(debian, ubuntu) jest znacznie szybszy niż pv, prawdopodobnie ze względu na wirtualny bufor pierścieniowy
Skaperen
@Skaperen Nie wiem vbuf. Ale wydaje się, że obecnie jest on niestabilny w Debianie i dlatego często nie jest dostępny na serwerach, na których zwykle działa stabilna wersja Debiana.
Marco
58

rsync działa najlepiej do pokazywania postępu podczas postępu kopiowania.

dawny:

rsync -avh --progress sourceDirectory destinationDirectory
JustStoppingThrough
źródło
27

Jak wyjaśniono w innych odpowiedziach, CP nie zapewnia tej funkcjonalności. Jednak postęp (wcześniej nazywany cv) to małe narzędzie, które jest bardzo pomocne w zapewnieniu tej brakującej funkcji.

To narzędzie można opisać jako polecenie * Tiny Dirty Linux Only * C, które wyszukuje podstawowe polecenia coreutils (cp, mv, dd, tar, gzip / gunzip, cat, ...) aktualnie wyświetlane w systemie i wyświetla odsetek skopiowanych dane.

Używam go od kilku miesięcy i jest solidny.

Amr Mostafa
źródło
wydaje się nie działać ze wszystkimi systemami plików (np. cifs), ale +1, nie znałem takich szalonych wyjść
akostadinov
1
Zauważ, że ten projekt nazywa się teraz „progress - Coreutils Progress Viewer (wcześniej znany jako cv)”.
chappjc,
17

Czy można zobaczyć szybkość CP i procent skopiowane?

Tak, możliwe jest wyświetlanie postępu polecenia cpna terminalu.


Metoda nr 1: (użyj progress)

Otwórz nowy terminal i wpisz progress, aby wyświetlić postęp cppolecenia i innych poleceń, takich jak:

cp, mv, dd, tar, cat, rsync, grep, fgrep, egrep, cut, sort, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, adb, gzip, gunzip, bzip2, bunzip2, xz, unxz, lzma, unlzma, 7z, zcat, bzcat, lzcat, split, gpg

Jeśli nie instalować progress, można go zainstalować z repozytorium, na przykład w CentOStym poleceniem: yum -y install progress.

Następnie po uruchomieniu cppolecenia w tle lub po cpnormalnym uruchomieniu otwórz inny terminal, więc po prostu wypróbuj to polecenie:

# progress -m

Zobacz dane wyjściowe:

[30904] cp /home/user/file.mp4
        2.3% (200.9 MiB / 8.4 GiB) 3.6 MiB/s remaining 0:38:58

Metoda nr 2: (użyj poprawki cp)

Lub pobierz GNU coreutilsi załataj go.

cd /tmp
wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz
tar -xvJf coreutils-8.21.tar.xz
cd coreutils-8.21
wget https://raw.githubusercontent.com/atdt/advcpmv/master/advcpmv-0.5-8.21.patch
patch -p1 -i advcpmv-0.5-8.21.patch

Biegać:

export FORCE_UNSAFE_CONFIGURE=1
./configure
make

Skopiować dwa pliki cpi mvloacated pod coreutils-8.21/src/do /usr/local/bin:

cp src/cp /usr/local/bin/cp
cp src/mv /usr/local/bin/mv

Lub skopiuj go za pomocą menedżera plików jako root

Dodaj następujące wiersze do ~/.bashrc:

alias cp='cp -gR'
alias mv='mv -g'

Wyloguj się i zaloguj

Pasek postępu może być wyświetlany bez –glub –progress-barzgodnie z zaleceniami autora

Zobacz dane wyjściowe:

0 files copied so far...                                              194.4 MiB /   8.4 GiB
[||--------------------------------------------------------------------------------]  2.3 %
Copying at   3.3 MiB/s (about 0h 5m 47s remaining)
/home/user/file.mp4                                                   194.4 MiB / 446.1 MiB
[||||||||||||||||||||||||||||||||||||----------------------------------------------] 43.6 %

Źródło: linuxhelp

GAD3R
źródło
1
Wygląda to na prawdziwe źródło cpłatki: web.archive.org/web/20131115171331/http://beatex.org/web/…
Kaushal Modi
1
+1 za podpowiedź na temat progresspolecenia
Piotr
to jedyna prawdziwa odpowiedź
Alessio
14

Zauważyłem, że ten post był nieco stary. Ale kiedy opracowałem rozwiązanie tego problemu, pomyślałem, że opublikuję swoje rozwiązanie.

Scenariusz: Mamy bardzo dużą strukturę katalogów, którą chcemy skopiować, dlatego wydajemy polecenie cp -R sourcedir destdir w jednym oknie terminala.

Otwórz inne okno terminala lub przesuń proces w tło (Ctrl+Z,bg<CR>), a następnie zróbmy wskaźnik postępu w getcie:

Najpierw otrzymujemy całkowity rozmiar struktury katalogów, którą chcemy skopiować, robimy to za pomocą:

du -sh /path/sourcedirectory/

Konwertuj wynik na gigabajty (G), a następnie podstaw n dla wyniku uzyskanego w zmiennej sizeize. Po wstawieniu źródła i katalogu docelowego (katalog docelowy) uruchom poniższe polecenie.

while true; do sourcesize=n destdir=/path/destinationdirectory/ copyprogress="$(export | du -sh $destdir | awk '{print $1}' | sed 's/[^0-9.]*//g' )" ; echo "scale=3 ; $copyprogress / $sourcesize * 100" | bc | xargs echo -n ; echo % completed ; sleep 10 ; done

Spowoduje to wydrukowanie postępu co 10 sekund z komunikatami takimi jak:

0.100% completed
0.200% completed
0.300% completed 
... etc

Wiem, że to rozwiązanie nie dotyczyło szybkości kopiowania, ale można by to dodać, rozszerzając powyższe polecenia, prawdopodobnie przekształcając je w skrypt bash, aby był łatwiejszy do odczytania. Na przykład sprawdzając, ile danych jest kopiowanych pr. W jednostce czasu prędkość powinna być prosta do obliczenia i wyświetlenia.

NordicViking
źródło
To jest naprawdę idealne dla mojego przypadku użycia, więc dziękuję za opublikowanie go! Chcę wiedzieć o postępach kopiowania ogromnego katalogu zawierającego tysiące plików, a nie tylko jeden plik, więc inne rozwiązania tak naprawdę mi nie pomagają.
Ibrahim,
Jest to świetne, szczególnie w przypadkach takich jak ten, którego obecnie doświadczam: zdalnie uruchomiłem ogromne zadanie mv, aby przenieść terrabajty kopii zapasowych z jednej puli pamięci do drugiej, bez wcześniejszego zastanowienia się nad konsekwencjami. Teraz mogę łatwo zorientować się w procesie i zajrzeć do niego. Niesamowite!
Riley
8

Aby poprawić odpowiedź Marco, dzisiaj napisałem tę wersję cpstat, aby można było skopiować wiele katalogów i użyć ostatniego parametru jako ścieżki docelowej. Zauważ, że jeśli użyjesz względnej głębokiej ścieżki jako źródła, możesz dzięki temu tarautomatycznie utworzyć to samo zależne drzewo katalogów.

function cpstat () {

    tar -cf - "${@: 1: $#-1}" |
    pv -s "$( du -cs -BK --apparent-size "${@: 1: $#-1}" |
              tail -n 1 |
              cut -d "$(echo -e "\t")" -f 1)" |
    ( cd "${@: $#}"; tar -xf - )

;}
poe84it
źródło
6

Nie w standardowej wersji cp.

Możesz ustawić tło cp i podać rozmiar podczas oczekiwania na cpzakończenie.

Używam tego perla do monitorowania wzrostu pojedynczego pliku, ale działa on zewnętrznie na cp (lub cokolwiek innego, co robię)

Matt
źródło
5

Chociaż rsyncda ci pewne statystyki postępu, jeśli chcesz pasek postępu, powinieneś użyć pv.

Możesz użyć cpvotoki pvz łatwiejszą składnią, bardziej podobną do tej cp, której można użyć do rekurencyjnego kopiowania katalogów

wprowadź opis zdjęcia tutaj

Możesz go zdobyć tutaj

nachoparker
źródło
+1 za podpowiedź pv. Niezłe znalezisko!
Peter
4

Użycie narzędzia takiego jak mc(dowódca północy) może być dobrą alternatywą dla innych odpowiedzi.

Jest to prosty menedżer plików, który pokazuje postęp kopiowania / przenoszenia.

Jseals
źródło
4

dd status=progress

Dodano opcję w GNU Coreutils 8.24+ (Ubuntu 16.04):

dd if=src of=dst status=progress

Stdout to okresowo aktualizowana linia, taka jak:

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s

Zobacz także: Jak monitorujesz postęp dd? | Zapytaj Ubuntu

Ciro Santilli
źródło
4

Innym prostym rozwiązaniem jest po prostu obejrzenie folderu wyjściowego w następujący sposób:

Linux / Cygwin: watch -n 10 --differences du -sk --apparent-size <WATCHED_FOLDER>

FreeBSD: gnu-watch -n 10 --differences du -sk <WATCHED_FOLDER>

To przydatne narzędzie uruchomi się dui podkreśli różnice.

Innym potencjalnym rozwiązaniem byłoby napisanie prostego skryptu, który zapętla, wywołuje dui wylicza przybliżoną przepustowość.

Timothy C. Quinn
źródło
3

To narzędzie jest poleceniem narzędzia Linux, które wyszukuje podstawowe polecenia coreutils (cp, mv, dd, tar, gzip / gunzip, cat itp.) Aktualnie uruchomione w systemie i wyświetla procent skopiowanych danych:

https://github.com/Xfennec/cv

saidi
źródło
1
Zostało to już zasugerowane przez @AmrMostafa w listopadzie 14.
Dubu
2

Właśnie miałem przypadek, w którym procesor był mniej lub bardziej zablokowany z powodu błędu FUSE w odbierającym systemie plików.

Jeśli nie możesz po prostu przełączyć się z cp (tj. Ponieważ --sparse = always) i chcesz czegoś, co jest naprawdę wiarygodne dla postępu, przejdź przez / proc.

Every 2.0s: cat /proc/20977/io                                                      Thu Sep 28 04:08:57 2017

rchar: 268573800
wchar: 268500992
syscr: 4112
syscw: 4097
read_bytes: 268697600
write_bytes: 0
cancelled_write_bytes: 0
Florian Heigl
źródło
0

VCP - kopiuj pliki w interfejsie przekleństw (Pokaż pasek postępu w systemie Linux).

OPIS: vcp kopiuje pliki i katalogi w interfejsie curses, z wyjściem tylko tekstowym. jego opcje i dane wyjściowe są podobne do cp BSD, dodając jednocześnie kilka nowych funkcji.

Zawiera informacje na temat:

  • pliki skopiowane i pozostawione do skopiowania
  • zapisane dane i całkowity rozmiar danych
  • dane są zapisywane co sekundę
  • dwa paski stanu, jeden pokazuje aktualny status pliku, drugi całkowity status (z wyjątkiem 1 pliku, oba pokazują aktualny) i procent

gdy dane wyjściowe są wysyłane do konsoli:

  • pasek stanu
  • rozmiar skopiowany i prędkość

Strona podręcznika VCP: https://linux.die.net/man/1/vcp

Pobierz vcp-2.2.tar.gz z:

http://distfiles.gentoo.org/distfiles/vcp-2.2.tar.gz

Zależność: curses.h (libncurses-dev).

W systemie Ubuntu zainstaluj:

sudo apt-get install libncurses-dev

lub

sudo apt-get install libncurses5-dev

ZAINSTALUJ vcp:

make && make install

Podręcznik:

man vcp
użytkownik350351
źródło