W przeciwnym razie, czy istnieje jakieś alternatywne narzędzie wiersza poleceń, które może to osiągnąć?
W przeciwnym razie, czy istnieje jakieś alternatywne narzędzie wiersza poleceń, które może to osiągnąć?
Odpowiedzi:
Chociaż cp
nie ma tej funkcji, możesz pv
to 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 pv
po 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. cp
w zasadzie nie robi nic bardziej wyszukanego niż
cat source > destination
(gdzie cat
po prostu odczytuje plik i drukuje go na standardowe wyjście). pv
jest 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 pv
aby dowiedzieć się więcej na ten temat.
Inną opcją, jak sugeruje DoR 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.
alias cp="rsync -avz"
cp jest nieaktualny.
pv
, możesz zajrzeć do niego /proc/PID of cp/fd
i /proc/PID of cp/fdinfo
dowiedzieć się o postępach. (Do ciebie należy ustalenie prędkości.) Używam tej techniki do oglądania updatedb
.
-z
prawdopodobnie powinien być używany tylko do kopii sieciowych; kompresowanie i dekompresowanie danych dla lokalnej kopii jest czystym narzutem.
rsync
pamię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
).
Nie ma Zobacz tutaj, dlaczego. Chociaż robi więcej, niż potrzebujesz, rsync
ma --progress
parametr. -a
Zachowa uprawnienia, itp, i -h
bę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)
-r
flagę do ponownego wyświetlania katalogów. Może być nawet aliasowany jako bezpośredni zamiennik cp:alias cp="rsync -ah --progress"
--progress
powoduje, ż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.
Jeśli chcesz sprawdzić, czy pliki są przesyłane poprawnie, możesz użyć gcp
i gcp
przypomina cp, ale domyślnie wyświetla pasek postępu, dzięki czemu możesz zobaczyć, co jest kopiowane. Jak zauważa strona wiki programu , gcp
ma 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.
gcp
służy do kopiowania plików i ma takie opcje, --preserve
że można zachować różne atrybuty i uprawnienia oraz --recursive
skopiować całe katalogi. Więcej informacji na temat jego opcji można znaleźć, wchodząc man gcp
lub przechodząc do stron internetowych Ubuntu online . Samouczek jest również dostępny na tej stronie .
Zainstaluj gcp
z 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 gcp
paska 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
.
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
export DISPLAY=:0.0
przed 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
gcp
jest 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@host
i to pozwoliło mi go uruchomić.
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.
pv
, że nie uratuje uprawnienia.
Chociaż nie wyświetla prędkości, podczas kopiowania wielu plików, -v
opcja do cp
polecenia zapewni informacje o postępie. na przykład
cp -rv old-directory new-directory
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)
...
pkill -USR1 dd
aby dd
pokazać jego status, inną opcją byłoby watch -n 1 pkill -USR1 dd
okresowe pokazywanie postępu (co sekundę).
W progress
repozytoriach 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)
Chociaż pv
może poradzić sobie z cp
zadaniami lokalnymi , używanie dd
z pv
moż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.mkv
wyjś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ń 100M
powyżej na rzeczywisty rozmiar pliku źródłowego.
Podczas gdy scp
ledwo widać aktualny postęp, używanie dd
with pv
to bułka z masłem.
ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
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
watch cv -q
jest jeszcze
cp
katalog rekurencyjnie kopiuje, czy nie.
Jak wielu powiedziało, CP nie zawiera tej funkcjonalności.
Żeby rzucić 0,02 $, co zwykle robię z trywialnymi sytuacjami kopiowania (tj. Nie -R
):
Zobacz, jak duży jest ten plik i pamiętaj
Rozpocznij kopiowanie
Otwórz inny terminal
Uruchom watch ls -lh DIR
katalog, 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 DIR
aby zobaczyć podsumowanie rozmiaru DIR. Jednak du może długo obliczać, a nawet spowalniać kopiowanie, więc możesz użyć -n INTERVAL
argumentu 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.
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?
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-r
tym 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”).
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% [===============================> ]
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 pv
lub rsync
są dobre do wyświetlania postępu transferu jednego dużego pliku, ale jeśli chodzi o kopiowanie całych katalogów / drzew, mc
oblicza 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.
może być jeszcze jedna opcja zachowania atrybutów (jeśli source
jest 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 source
z wyprzedzeniem i przekazując go jako -s <size>
parametr do pv
.
-f -
jest zbędny. tar
Domyślne wyjście c
i wejście dla x
to stdout i stdin.
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
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] [ <=> ]
pv
nie obsługuje uprawnień w taki sam sposób jakcp
... (w oparciu o jeden szybki test, który próbowałem:pv
nie kopiowałem bitów wykonawczych przez ...rsync
zrobiłem.