Jak pokazać postęp i prędkość przesyłania podczas kopiowania plików za pomocą cp?

326

W przeciwnym razie, czy istnieje jakieś alternatywne narzędzie wiersza poleceń, które może to osiągnąć?

Olivier Lalonde
źródło

Odpowiedzi:

249

Chociaż cpnie ma tej funkcji, możesz pvto zrobić:

pv my_big_file > backup/my_big_file

Uwaga: ta metoda spowoduje utratę uprawnień i własności pliku. Pliki skopiowane w ten sposób będą miały takie same uprawnienia, jak gdybyś je utworzył i będą należeć do Ciebie.

W tym przykładzie pvpo prostu wyprowadza plik na standardowe wyjście *, które przekierowujesz do pliku za pomocą >operatora. Jednocześnie, kiedy to robisz, drukuje informacje o postępie na terminalu.

Tak to wygląda:

stefano@ubuntu:~/Data$ pv my_big_file > backup/my_big_file
 138MB 0:00:01 [73.3MB/s] [=================================>] 100% 

Może być konieczne  zainstalowanie pv (alternatywnie wpisz sudo apt-get install pv) w systemie.


*: Bit techniczny

Istnieją trzy ważne strumienie danych w systemie uniksopodobnym: stdout (standardowe wyjście), stderr (standardowy błąd) i stdin (standardowe wejście). Każdy program ma wszystkie trzy, że tak powiem. >Operatorem przekierowania przekierowania wyjście programu do pliku. Bez argumentów, jak widać powyżej, >przekierowuje standardowe wyjście programu do pliku. cpw zasadzie nie robi nic bardziej wyszukanego niż

cat source > destination

(gdzie catpo prostu odczytuje plik i drukuje go na standardowe wyjście). pvjest jak cat, ale jeśli przekierujesz jego strumień wyjściowy w inne miejsce, zamiast tego wypisze informacje o postępie na standardowe wyjście.

Spójrz na, man pvaby dowiedzieć się więcej na ten temat.


Inną opcją, jak sugeruje alternatywny tekstDoR w tej odpowiedzi , jest użycie rsync zamiast:

$ rsync -ah --progress source-file destination-file
sending incremental file list
source-file
        621.22M  57%  283.86MB/s    0:00:01

Pozwoli to zachować uprawnienia do plików / prawa własności podczas wyświetlania postępu.

Stefano Palazzo
źródło
3
Może, ale nie musi być znaczący (w zależności od sytuacji), ale pvnie obsługuje uprawnień w taki sam sposób jak cp... (w oparciu o jeden szybki test, który próbowałem: pvnie kopiowałem bitów wykonawczych przez ... rsynczrobiłem.
Peter .O
45
IMO: alias cp="rsync -avz"cp jest nieaktualny.
Marco Ceppi
11
Jeśli jesteś podobny do mnie i zapomnisz o tym pv, możesz zajrzeć do niego /proc/PID of cp/fdi /proc/PID of cp/fdinfodowiedzieć się o postępach. (Do ciebie należy ustalenie prędkości.) Używam tej techniki do oglądania updatedb.
Thanatos,
11
Tak, -zprawdopodobnie powinien być używany tylko do kopii sieciowych; kompresowanie i dekompresowanie danych dla lokalnej kopii jest czystym narzutem.
Mateusz
3
@MarcoCeppi, podczas kopiowania katalogu rsyncpamiętaj, aby nie dodawać końcowego /do ścieżki źródłowej (lub usuń, jeśli np. Zakończenie bash umieści go tam automatycznie). W przeciwnym razie otrzymasz wyniki inne niż podczas używania cp(lub gcp).
Piotr Findeisen,
185

Nie ma Zobacz tutaj, dlaczego. Chociaż robi więcej, niż potrzebujesz, rsyncma --progressparametr. -aZachowa uprawnienia, itp, i -hbędzie czytelny dla człowieka.

rsync -ah --progress source destination

Dane wyjściowe będą wyglądać mniej więcej tak:

Pictures/1.jpg
      2.13M 100%    2.28MB/s    0:00:00 (xfr#5898, to-chk=1/5905)
Pictures/2.jpg
      1.68M 100%    1.76MB/s    0:00:00 (xfr#5899, to-chk=0/5905)
Bartekbrak
źródło
4
Działa to świetnie w obecnym Ubuntu (14.10). Obsługuje również -rflagę do ponownego wyświetlania katalogów. Może być nawet aliasowany jako bezpośredni zamiennik cp:alias cp="rsync -ah --progress"
rustyx
1
Działa pęczniejąco na OS X, z możliwością korzystania z narzędzi dołączonych do systemu.
Ivan X
3
Lubię to alternatywa lepiej niż pv, specjalnie ponieważ rsync jest częścią standardowej instalacji
Joao Costa
1
@bartekbrak dzięki za udostępnienie. Obecnie korzystam z systemu macOS 10.12.x, uruchamiając homebrew wersję rsync 3.1.2 i używanie --progresspowoduje, że moja głowa obraca się 🙃, obserwując cały wyświetlacz wyjściowy w terminalu. Więc ci, którzy przychodzą tutaj z wyszukiwań słów kluczowych AOL, rsync -ah --info=progress2 [source] [destination] przedstawiają wyniki w nieco bardziej rozsądny sposób IMHO.
ipatch
2
Niestety dane wyjściowe nie są bardzo pomocne podczas kopiowania wielu małych plików.
Raphael
89

Jeśli chcesz sprawdzić, czy pliki są przesyłane poprawnie, możesz użyć gcpi gcpprzypomina cp, ale domyślnie wyświetla pasek postępu, dzięki czemu możesz zobaczyć, co jest kopiowane. Jak zauważa strona wiki programu , gcpma kilka przydatnych funkcji, takich jak

  • wskazanie postępu transferu
  • ciągłe kopiowanie w przypadku błędu (przejście do następnego pliku)
  • kopiuj rejestrowanie statusu: gcp rejestruje wszystkie swoje działania, aby można było wiedzieć, które pliki zostały pomyślnie skopiowane
  • manipulowanie nazwami w celu obsługi ograniczeń docelowych systemów plików (na przykład usuwanie niekompatybilnych znaków „*” lub „?” w systemie FAT)

Jednak nawet gdy pasek postępu osiągnie 100% podczas korzystania z narzędzia, musisz poczekać, aż pojawi się ponownie monit terminala, zanim bezpiecznie usuniesz nośnik, aby mieć pewność, że proces przesyłania zakończy się pomyślnie.

gcpsłuży do kopiowania plików i ma takie opcje, --preserveże można zachować różne atrybuty i uprawnienia oraz --recursiveskopiować całe katalogi. Więcej informacji na temat jego opcji można znaleźć, wchodząc man gcplub przechodząc do stron internetowych Ubuntu online . Samouczek jest również dostępny na tej stronie .

Zainstaluj gcpz repozytoriów za pomocą

sudo apt-get install gcp

( Uwaga : w Ubuntu 12.10 nowym punktem automount jest na przykład /media/user/usbdisk)

Możesz skopiować plik na swój nośnik, wprowadzając

gcp /home/mike/file.mp4 /media/usb

i skopiuj folder na swoje media za pomocą

gcp -rv ~/Podcasts /media/Mik2

Przykładowe dane wyjściowe z gcppaska postępu:

gcp ~/Videos_incIplayer/mars.flv /media/Mik2
Copying 168.57 MiB 100% |########################################################|   7.98 M/s Time: 00:00:22

Możesz oczywiście określić wiele plików lub folderów do skopiowania na dysk, a także wiele innych opcji man gcp.


źródło
4
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Wystąpił
3
jeśli masz otwarty wyświetlacz X11 na komputerze, możesz go ustawić export DISPLAY=:0.0przed uruchomieniem gcp. Jeśli maszyna jest bezgłowa, musiałbyś rozpocząć xsession w wirtualnym buforze ramek lub coś takiego, w tym momencie prawdopodobnie powinieneś po prostu poszukać innego programu
user292067
2
gcpjest całkiem przyzwoity, ale wymaganie DBUS / X jest dziwne. Poradziłem sobie z tym za pośrednictwem SSH, używając przekazywania dalej ssh: ssh -X user@hosti to pozwoliło mi go uruchomić.
Oli
68

Mam problem z użyciem cURL do tego właśnie celu. Strona podręcznika zawiera listę obsługiwanych protokołów „PLIK”, więc po prostu używaj go jak każdego innego protokołu w adresie URL:

curl -o destination FILE://source

Szybkość, postęp, pozostały czas i więcej - wszystko w znanym formacie.

matematyk
źródło
1
Jest to szczególnie przydatne w środowiskach, w których nie wolno instalować nowych narzędzi i gdzie rsync jest niedostępny.
5
Genialne, to musi być znany hack!
ionreflex,
Niezła odpowiedź! Sprytny!
9301293,
To przypuszczalnie ma tę samą wadę co pv, że nie uratuje uprawnienia.
Ploni
1
Słodkie! jakikolwiek sposób, aby to zadziałało dla katalogu?
Joseph Rajeev Motha,
28

Chociaż nie wyświetla prędkości, podczas kopiowania wielu plików, -vopcja do cppolecenia zapewni informacje o postępie. na przykład

cp -rv old-directory new-directory
Ubuntourist
źródło
10
Informacje o postępie? To jest tylko pełne wyjście. Aby podać informacje o postępie, musisz przynajmniej określić, ile plików, a nawet które pliki należy skopiować.
Julian F. Weinert
Pokazuje, w jakim pliku się znajduje, co może wystarczyć w mniej wymagających przypadkach.
Gringo Suave
20

Jądro zna większość danych, takich jak prędkość, a często także procent. Nowoczesne jądra udostępniają to poprzez swój system plików / proc.

showspeed z https://github.com/jnweiger/showspeed korzysta z tych informacji. Może łączyć się z już działającymi programami i okresowo aktualizować:

$ dd if=bigfile of=/tmp/otherbigfile &
$ showspeed dd
dd looks like a process name. pid=4417 matches av0=dd.
p/4417/fd/0r /home/jw/bigfile 113MB/s (12%, 2.3GB)  9m:35
p/4417/fd/1w /tmp/otherbigfile 182MB/s (2.6GB)
p/4417/fd/0r /home/jw/bigfile 285MB/s (15%, 3.0GB)  8m:08
p/4417/fd/0r /home/jw/bigfile 115MB/s (16%, 3.2GB)  8m:01
p/4417/fd/0r /home/jw/bigfile 107MB/s (17%, 3.4GB)  7m:39
p/4417/fd/1w /tmp/otherbigfile 104MB/s (3.5GB)
p/4417/fd/0r /home/jw/bigfile 139MB/s (19%, 3.7GB)  7m:37
p/4417/fd/0r /home/jw/bigfile 116MB/s (20%, 3.9GB)  7m:18
p/4417/fd/1w /tmp/otherbigfile  67MB/s (4.0GB)
p/4417/fd/1w /tmp/otherbigfile 100MB/s (4.1GB)
...
Jürgen Weigert
źródło
Niezłe. Jak to jednak działa w procentach? Chyba tylko w przypadku plików otwartych jako tylko do odczytu? I prawdopodobnie nie będzie działać w przypadku rozproszonego dostępu.
j_kubik
1
W takim przypadku możesz również użyć innego terminala do uruchomienia, pkill -USR1 ddaby ddpokazać jego status, inną opcją byłoby watch -n 1 pkill -USR1 ddokresowe pokazywanie postępu (co sekundę).
Yaron,
Dobrze. Wiele narzędzi ma wbudowany sposób raportowania statystyk w czasie. dd nie jest wyjątkiem. Nowoczesne implementacje mają opcję status = postęp. Showspeed to klasyczne rozwiązanie typu „jedno narzędzie do jednego celu” w stylu uniksowym - podobnie jak pv. Ale ma różne przypadki użycia: Pomyśl o kubkach pompujących plik przez ghostscript lub chcesz poznać ETA dla trwającego cp lub tar. Może to być wykonane w 95% już po kilku godzinach i prawdopodobnie nie chcesz restartować tego tylko po to, aby dodać pv ... Rozproszony dostęp nie działałby dobrze. Próbki pokazują tylko próbki prędkości.
Jürgen Weigert
18

W progressrepozytoriach istnieje narzędzie wywoływane, które może badać różne polecenia i wyświetlać dla nich informacje o postępach.

Zainstaluj go za pomocą polecenia

sudo apt-get install progress

Tego narzędzia można użyć w następujący sposób:

cp bigfile newfile & progress -mp $!

Wynik:

[11471] cp /media/Backup/Downloads/FILENAME.file 
        29.9% (24.2 MiB / 16 MiB)
Nataniel A Malinowski
źródło
12

Chociaż pvmoże poradzić sobie z cpzadaniami lokalnymi , używanie ddz pvmoże poradzić sobie zarówno z zadaniami lokalnymi ( cp), jak i zdalnymi ( scp).

dd if=path/to/source.mkv | pv | dd of=path/to/dest.mkv

Upewnij się, że path/to/dest.mkvwyjścia dotouch path/to/dest.mkv

Może to pokazywać postęp, ale jeśli chcesz uzyskać informacje procentowe,

dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv

Zamień 100Mpowyżej na rzeczywisty rozmiar pliku źródłowego.

Nadchodzi część zdalna

Podczas gdy scpledwo widać aktualny postęp, używanie ddwith pvto bułka z masłem.

ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
onemach
źródło
1
Nowszy ddma status=progress: askubuntu.com/a/824895/52975
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
11

Istnieje nowe narzędzie o nazwie cv, które może znaleźć dowolny deskryptor związany z uruchomionym poleceniem i pokazać postęp i prędkość: https://github.com/Xfennec/cv

cv -w

wyświetla statystyki wszystkich uruchomionych operacji cp, mv itp

naugtur
źródło
watch cv -qjest jeszcze
ładniejszy
Pokazuje tylko postępy dla poszczególnych plików, zdaje sobie sprawę, czy cpkatalog rekurencyjnie kopiuje, czy nie.
Flimm
1
Wojna przemianowana na postęp. Świetne narzędzie!
Sebastian
7

Jak wielu powiedziało, CP nie zawiera tej funkcjonalności.

Żeby rzucić 0,02 $, co zwykle robię z trywialnymi sytuacjami kopiowania (tj. Nie -R):

  1. Zobacz, jak duży jest ten plik i pamiętaj

  2. Rozpocznij kopiowanie

  3. Otwórz inny terminal

  4. Uruchom watch ls -lh DIRkatalog, w którym znajduje się cel

Dzięki temu mogę informować mnie na bieżąco o rozmiarze pliku docelowego, bez większych problemów.

Jako alternatywę dla mniej trywialnych sytuacji, np. Rekurencyjnego kopiowania katalogów, możesz użyć, watch du -hs DIRaby zobaczyć podsumowanie rozmiaru DIR. Jednak du może długo obliczać, a nawet spowalniać kopiowanie, więc możesz użyć -n INTERVALargumentu do oglądania, aby kompromis był akceptowalny.

Aktualizacja: Jeśli używasz symboli wieloznacznych z poleceniem używanym z watch du, np. watch du -hs backup/*Nie zapomnij zacytować:

watch "du -hs backup/*"

w przeciwnym razie symbole wieloznaczne zostaną rozwinięte tylko raz , gdy zegarek zostanie uruchomiony, więc du nie będzie patrzeć na nowe pliki / podkatalogi.

Alois Mahdal
źródło
Nie odpowiada jednak na część „prędkość” ...
Alois Mahdal
7

dd status=progress

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

dd if=src of=dst status=progress

Terminal pokazuje linię typu:

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

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

Ciro Santilli
źródło
1
Miałeś na myśli: stdout to strumień znaków i sekwencji ucieczki vt100, które sprawiają, że twój terminal wyświetla okresowo aktualizowaną linię;). stdout jest zawsze strumieniem bajtów i nie ma nic wspólnego z tym, jak jest wyświetlany (poza tym, że aplikacja może wiedzieć, czy jest aktualnie podłączona do terminala, czy nie ...)
masterxilo,
@masterxilo newbs nie będzie obchodzić, eksperci będą wiedzieć ;-) hehe
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Cóż, myślę, że zawsze dobrze jest podawać rzeczy takimi, jakie są, być może pomijając pewne szczegóły, ale nigdy nie zmuszaj czytelników do tworzenia niewłaściwego modelu mentalnego. Jeśli powiesz „stdout jest (okresowo aktualizowaną) linią”, wygląda na to, że mówisz, że stdout to blok zmiennej pamięci, który nim nie jest. To ważne, aby wiedzieć, nawet dla początkujących.
masterxilo,
6

Jeśli masz rsync w wersji 3.1 lub nowszej ( rsync --version), możesz kopiować (cp -Rpn), zachowując uprawnienia i własność, rekurencyjne katalogi, „bez blokowania” i wyświetlać ogólny postęp (zamiast po prostu postęp po pliku), szybkość kopiowania i ( bardzo szorstki) szacowany czas pozostały przy:

sudo rsync -a --info=progress2 --no-i-r /source /destination

Pamiętaj, że sudo jest potrzebne tylko w przypadku katalogów / plików, których nie posiadasz. Poza --no-i-rtym wartość procentowa może zostać zresetowana do niższej liczby w pewnym momencie podczas kopiowania. Być może późniejsze wersje rsync będą domyślnie ustawione na no-ir z info = progress2, ale nie ma go w obecnej wersji 3.1.2.

Przekonałem się, że procent i pozostały czas są rażąco zawyżone podczas kopiowania do katalogu, który już zawiera pliki (np. Kiedy zwykle użyjesz cp -n „no clobber”).

S Lentz
źródło
3

Użyj skryptu powłoki:

#!/bin/sh
cp_p()
{
   strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \
      | awk '{
        count += $NF
            if (count % 10 == 0) {
               percent = count / total_size * 100
               printf "%3d%% [", percent
               for (i=0;i<=percent;i++)
                  printf "="
               printf ">"
               for (i=percent;i<100;i++)
                  printf " "
               printf "]\r"
            }
         }
         END { print "" }' total_size=$(stat -c '%s' "${1}") count=0
}

Będzie to wyglądać następująco:

% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================>                      ]

Źródło

Jan
źródło
3

W zależności od tego, co chcesz zrobić, Midnight Commander ( mc) może być odpowiedzią. Dziwię się, że jeszcze nie wspomniano.

Narzędzia takie jak pvlub rsyncsą dobre do wyświetlania postępu transferu jednego dużego pliku, ale jeśli chodzi o kopiowanie całych katalogów / drzew, mcoblicza rozmiar, a następnie bardzo ładnie wyświetla postęp. Ponadto jest dostępny od razu po wyjęciu z pudełka na większości systemów.

kralyk
źródło
2
„jest dostępny od razu w większości systemów”. ... nie w żadnej domyślnej instalacji Ubuntu.
muru 30.01.2016
1

może być jeszcze jedna opcja zachowania atrybutów (jeśli sourcejest to folder, w którym zostanie utworzony destination)

tar -c source | pv -e -t -p -r | tar -C destination  -x

mam nadzieję, że może się komuś przydać. Aby oszacować czas transferu, można to zrobić do -s sourcez wyprzedzeniem i przekazując go jako -s <size>parametr do pv.

ciekawy
źródło
-f -jest zbędny. tarDomyślne wyjście ci wejście dla xto stdout i stdin.
muru
Czy może zależeć od wersji OS / tar? Wiem, że jest to strona Ubuntu jeszcze może to być przydatne dla innych właścicieli OS jak MacOS
ciekawy
1
Nie. Wszystkie rozsądne implementacje (w tym tar libarchive, których używa macOS) mają takie zachowanie.
muru
właśnie zweryfikowałem na makach, a twoja sugestia jest całkowicie poprawna - zaktualizowałem swoją odpowiedź. Dzięki!
ciekawy
0

Możesz skopiować za pomocą dowolnego programu. Jednocześnie możesz rozpocząć sudo iotopi zobaczyć rzeczywistą prędkość odczytu / zapisu dysku, ale bez postępu.

McKelvin
źródło
0

Sprawdź kod źródłowy paska postępu w poniższym repozytorium git

https://github.com/Kiran-Bose/supreme

Wypróbuj również niestandardowy pakiet skryptu bash najwyższy

Pobierz plik deb i zainstaluj w dystrybucji opartej na Debianie lub pobierz pliki źródłowe, zmodyfikuj i użyj dla innych dystrybucji

Przegląd funkcjonalności

(1) Otwórz aplikacje ---- Firefox ---- Kalkulator ---- Ustawienia

(2) Zarządzaj plikami ---- Wyszukaj ---- Nawiguj ---- Szybki dostęp

            |----Select File(s)
            |----Inverse Selection
            |----Make directory
            |----Make file
                                          |----Open
                                          |----Copy
                                          |----Move
                                          |----Delete
                                          |----Rename
                                          |----Send to Device
                                          |----Properties

(3) Zarządzaj telefonem ---- Przenieś / Kopiuj z telefonu ---- Przenieś / Kopiuj do telefonu ---- Synchronizuj foldery

(4) Zarządzaj USB ---- Przenieś / Kopiuj z USB ---- Przenieś / Kopiuj na USB

KIRAN B.
źródło
0

pv wie, jak oglądać deskryptory plików z danym pidem, niezależnie od tego, czy jest to cp, czy coś innego

Z dokumentacji:

   (Linux only): Watching file descriptor 3 opened by another process 1234:

          pv -d 1234:3

   (Linux only): Watching all file descriptors used by process 1234:

          pv -d 1234

Przykład:

md5sum file &
[1] + 1271 suspended
pv -d 1271
417MiB 0:00:17 [12,1MiB/s] [============>                                 ] 29% ETA 0:00:53

$ cp file.mov copy.mov &
[2] 3731
$ pv -d 3731
3:/media/windows/file.mov:  754MiB 0:00:04 [97,2MiB/s] [======================>                       ] 52% ETA 0:00:07
4:/media/windows/copy.mov:  754MiB 0:00:04 [97,3MiB/s] [     <=>                                                                   ] 
alecail
źródło