Wie wird der Übertragungsfortschritt und die Übertragungsgeschwindigkeit beim Kopieren von Dateien mit cp angezeigt?

326

Andernfalls gibt es ein alternatives Befehlszeilendienstprogramm, mit dem dies erreicht werden kann?

Olivier Lalonde
quelle

Antworten:

249

Während cphat diese Funktionalität nicht erhalten haben, können Sie verwenden , um pvdies zu tun:

pv my_big_file > backup/my_big_file

Hinweis: Bei dieser Methode gehen die Berechtigungen und der Besitz der Datei verloren. Auf diese Weise kopierte Dateien haben die gleichen Berechtigungen, als hätten Sie sie selbst erstellt und gehören Ihnen.

In diesem Beispiel wird pvdie Datei im Grunde nur an stdout * ausgegeben, das Sie mit dem >Operator in eine Datei umleiten . Gleichzeitig werden dabei Informationen über den Fortschritt an das Terminal gesendet.

So sieht es aus:

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

Möglicherweise müssen  Sie pvsudo apt-get install pv auf Ihrem System installieren (alternativ eingeben ).


*: Das technische Bit

In einem Unix-ähnlichen System gibt es drei wichtige Datenströme: stdout (Standardausgabe), stderr (Standardfehler) und stdin (Standardeingabe). Jedes Programm hat sozusagen alle drei. Der >Umleitungsoperator leitet die Programmausgabe in eine Datei um. Wie Sie oben sehen, wird >die Standardausgabe eines Programms ohne Argumente in eine Datei umgeleitet . cpIm Grunde nichts schicker als

cat source > destination

(Wo catliest gerade eine Datei und druckt es auf stdout). pvist wie cat, aber wenn Sie den Ausgabestream an eine andere Stelle umleiten, werden stattdessen Fortschrittsinformationen an stdout ausgegeben.

Schauen Sie sich um man pv, um mehr darüber zu erfahren.


Eine andere Möglichkeit, wie Alt-TextDoR in dieser Antwort vorschlägt , besteht darin, stattdessen rsync zu verwenden:

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

Dadurch bleiben die Dateiberechtigungen / -eigentümer erhalten, während der Fortschritt angezeigt wird.

Stefano Palazzo
quelle
3
Es kann bedeutsam sein oder auch nicht (abhängig von der Situation), aber pves behandelt Berechtigungen nicht so wie cp... (basierend auf einem kurzen Test, den ich ausprobiert habe: pvhabe das Ausführungsbit nicht über ... kopiert rsync.
Peter .O
45
IMO: alias cp="rsync -avz"cp ist veraltet.
Marco Ceppi
11
Wenn du wie ich bist und es vergisst pv, kannst du einschnüffeln /proc/PID of cp/fdund /proc/PID of cp/fdinfoden Fortschritt herausfinden. (Es liegt an Ihnen, die Geschwindigkeit abzuleiten.) Ich benutze diese Technik, um zu beobachten updatedb.
Thanatos
11
Ja, -zsollte wahrscheinlich nur für Netzwerkkopien verwendet werden. Das Komprimieren und Dekomprimieren der Daten für eine lokale Kopie ist ein reiner Aufwand.
Matthew Read
3
@MarcoCeppi, wenn Sie ein Verzeichnis kopieren rsync, achten Sie darauf, dass Sie dem Quellpfad kein Trailing hinzufügen /(oder es entfernen, wenn zB die Bash-Vervollständigung es automatisch dort ablegt). Andernfalls erhalten Sie andere Ergebnisse als bei Verwendung von cp(oder gcp).
Piotr Findeisen
185

Gibt es nicht Sehen Sie hier , warum. Obwohl es mehr tut, als Sie brauchen, rsynchat es einen --progressParameter. Sie -abehalten Berechtigungen usw. und -hsind für den Menschen lesbar.

rsync -ah --progress source destination

Die Ausgabe sieht ungefähr so ​​aus:

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
quelle
4
Dies funktioniert im aktuellen Ubuntu (14.10) hervorragend. Es unterstützt auch das -rFlag zum Wiederverwenden von Verzeichnissen. Es kann sogar als direkter Ersatz für cp alias cp="rsync -ah --progress"
aliasiert werden
1
Funktioniert unter OS X mit dem Vorteil, dass die im System enthaltenen Tools verwendet werden können.
Ivan X
3
Ich mag diese Alternative besser als pv, vor allem, weil rsync Teil der Standardinstallation ist
Joao Costa
1
@bartekbrak danke fürs teilen. Ich arbeite derzeit unter MacOS 10.12.x mit der Homebrew-Version von Rsync 3.1.2 und mit --progressdreht sich mein Kopf - ich beobachte die gesamte Ausgabe im Terminal. Diejenigen, die hier von der AOL-Schlüsselwortsuche kommen, rsync -ah --info=progress2 [source] [destination] präsentieren die Ausgabe meiner Meinung nach ein wenig vernünftiger.
ipatch
2
Leider ist die Ausgabe beim Kopieren vieler kleiner Dateien nicht sehr hilfreich.
Raphael
89

Wenn Sie sehen möchten, ob Ihre Dateien übertragen korrekt könnten Sie gcpund gcpist wie cp aber standardmäßig gibt Ihnen einen Fortschrittsbalken , so dass Sie sehen können , was kopiert wird. Wie das Programm im Wiki mitteilt , gcpverfügt es über mehrere nützliche Funktionen wie z

  • Übertragungsfortschrittsanzeige
  • kontinuierliches Kopieren bei Fehler (zur nächsten Datei springen)
  • Protokollierung des Kopierstatus: gcp protokolliert alle Aktionen, damit Sie wissen, welche Dateien erfolgreich kopiert wurden
  • Namensmanipulation zur Behebung von Einschränkungen des Zieldateisystems (z. B. Löschen von nicht kompatiblen Zeichen "*" oder "?" auf FAT)

Selbst wenn der Fortschrittsbalken bei Verwendung des Tools 100% erreicht hat, müssen Sie warten, bis die Eingabeaufforderung Ihres Terminals erneut angezeigt wird, bevor Sie Ihre Medien sicher entfernen, damit Sie sicherstellen können, dass der Übertragungsvorgang erfolgreich abgeschlossen wurde.

gcpwird zum Kopieren von Dateien verwendet und verfügt über Optionen, mit --preservedenen verschiedene Attribute und Berechtigungen beibehalten und --recursiveganze Verzeichnisse kopiert werden können. Weitere Informationen zu den Optionen erhalten Sie, indem Sie man gcpdie Online-Hilfeseiten von Ubuntu aufrufen oder diese aufrufen . Ein Tutorial ist auch auf dieser Site verfügbar .

Installieren Sie gcpaus den Repositories mit

sudo apt-get install gcp

( Hinweis : In Ubuntu 12.10 ist der neue Automount-Punkt beispielsweise /media/user/usbdisk)

Sie können eine Datei auf Ihr Medium kopieren, indem Sie eingeben

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

und kopieren Sie einen Ordner auf Ihr Medium mit

gcp -rv ~/Podcasts /media/Mik2

Beispielausgabe gcpmit dem Fortschrittsbalken:

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

Sie können natürlich mehrere Dateien oder Ordner angeben, die auf Ihre Festplatte kopiert werden sollen, und es gibt viele andere Optionen, die in behandelt werden man gcp.


quelle
4
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Habe
3
Wenn auf dem Computer ein X11-Display geöffnet ist, können Sie dies export DISPLAY=:0.0vor dem Starten von gcp einstellen. Wenn die Maschine kopflos ist, müssen Sie eine xsession in einem virtuellen Framebuffer starten oder so, an diesem Punkt sollten Sie wahrscheinlich nur nach einem anderen Programm suchen
user292067
2
gcpist ziemlich anständig, aber die DBUS / X-Anforderung ist ungerade. Ich habe das über SSH erledigt, indem ich ssh forwarding verwendet habe: ssh -X user@hostund das erlaubte mir, es auszuführen.
Oli
68

Die Verwendung von cURL für genau diesen Zweck macht mir Spaß. Die Manpage listet das "FILE" -Protokoll als unterstützt auf. Verwenden Sie es also wie jedes andere Protokoll in einer URL:

curl -o destination FILE://source

Geschwindigkeit, Fortschritt, verbleibende Zeit und mehr - alles in einem vertrauten Format.

Mathematiker
quelle
1
Dies ist besonders in Umgebungen von Vorteil, in denen Sie keine neuen Tools installieren dürfen und in denen rsync nicht verfügbar ist.
5
Genial, das muss ein Muss sein!
Ionreflex
Gute Antwort! Klug!
9301293
Dies hat vermutlich den gleichen Nachteil wie pv, dass es Berechtigungen nicht retten wird.
Ploni
1
Süss! wie kann man das für ein verzeichnis machen?
Joseph Rajeev Motha
28

Während die Geschwindigkeit nicht angezeigt wird, werden beim Kopieren mehrerer Dateien über die -vOption zum cpBefehl Statusinformationen angezeigt . z.B

cp -rv old-directory new-directory
Ubuntourist
quelle
10
Fortschrittsinfo? Dies ist nur eine ausführliche Ausgabe. Um Fortschrittsinformationen bereitzustellen, müssten Sie jetzt mindestens angeben, wie viele Dateien oder sogar welche Dateien kopiert werden müssen.
Julian F. Weinert
Es zeigt, auf welcher Datei es sich befindet, was in weniger anspruchsvollen Fällen ausreichen kann.
Gringo Suave
20

Der Kernel kennt die meisten Daten wie die Geschwindigkeit und oft auch den Prozentsatz. Moderne Kernel stellen dies über ihr / proc-Dateisystem zur Verfügung.

showspeed von https://github.com/jnweiger/showspeed verwendet diese Informationen. Es kann an bereits laufende Programme angehängt werden und regelmäßige Aktualisierungen wie folgt durchführen:

$ 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
quelle
Schön. Wie errechnet sich der Prozentsatz? Ich vermute, nur im Falle von Datei s als schreibgeschützt geöffnet? Und es wird wahrscheinlich nicht funktionieren, wenn der Zugriff verstreut ist.
j_kubik
1
In diesem Fall können Sie auch ein anderes Terminal zum Ausführen verwenden pkill -USR1 dd, um dddessen Status anzuzeigen. Eine andere Option besteht watch -n 1 pkill -USR1 dddarin, den Fortschritt regelmäßig (jede Sekunde) anzuzeigen.
Yaron
Richtig. Viele Tools haben eine integrierte Möglichkeit, Statistiken über einen bestimmten Zeitraum zu erstellen. dd ist keine ausnahme. Moderne Implementierungen verfügen über eine Status = Progess-Option. Showspeed ist eine klassische Lösung im Unix-Stil "one tool for one purpose" - genau wie pv. Aber es hat verschiedene Verwendungszwecke: Stellen Sie sich vor, Sie pumpen eine Datei durch Ghostscript, oder Sie möchten die ETA für einen laufenden CP oder Teer erfahren. Es könnte sein, dass es bereits nach ein paar Stunden zu 95% erledigt ist und Sie das wahrscheinlich nicht neu starten möchten, nur um pv hinzuzufügen ... Der verstreute Zugriff würde nicht gut funktionieren. Showspeed nur Samples suchen Positionen.
Jürgen Weigert
18

progressIn den Repositorys gibt es ein Tool, mit dem verschiedene Befehle überprüft und deren Fortschrittsinformationen angezeigt werden können.

Installieren Sie es mit dem Befehl

sudo apt-get install progress

Dieses Tool kann folgendermaßen verwendet werden:

cp bigfile newfile & progress -mp $!

Ausgabe:

[11471] cp /media/Backup/Downloads/FILENAME.file 
        29.9% (24.2 MiB / 16 MiB)
Nathaniel A Malinowski
quelle
12

Während pvmit lokalen umgehen cpAufgaben, mit ddmit pvmit lokalen umgehen kann ( cp) und Remote ( scp) Aufgaben.

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

Bitte stellen Sie die path/to/dest.mkvAusgänge durchtouch path/to/dest.mkv

Dies kann den Fortschritt anzeigen, aber wenn Sie die prozentualen Informationen möchten,

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

Ersetzen Sie 100Moben durch die tatsächliche Größe Ihrer Quelldatei.

Hier kommt der Remote-Teil

Während der scpaktuelle Fortschritt kaum zu erkennen ist, ist die Verwendung von ddwith pvein Kinderspiel.

ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
onemach
quelle
1
Neuere ddhat status=progress: askubuntu.com/a/824895/52975
Ciro Santilli
11

Es gibt ein neues Tool namens "cv", mit dem Sie alle Deskriptoren finden können, die sich auf einen ausgeführten Befehl beziehen und den Fortschritt und die Geschwindigkeit anzeigen können: https://github.com/Xfennec/cv

cv -w

gibt die Statistiken für alle laufenden Operationen cp, mv usw. aus

naugtur
quelle
watch cv -qist noch ordentlicher
nwgat
Es wird nur der Fortschritt für einzelne Dateien angezeigt, es wird jedoch erkannt, ob cpein Verzeichnis rekursiv kopiert wird oder nicht.
Flimm
1
Es wurde in Fortschritt umbenannt. Tolles Werkzeug!
Sebastian
7

Wie viele sagten, enthält cp diese Funktionalität nicht.

Nur um meine $ 0.02 zu werfen, was ich normalerweise mit trivialen Kopiersituationen mache (dh nein -R):

  1. Sehen Sie, wie groß die Datei ist und merken Sie sich

  2. Beginnen Sie mit dem Kopieren

  3. Öffnen Sie ein anderes Terminal

  4. Führen Sie watch ls -lh DIRdas Verzeichnis aus, in dem sich das Ziel befindet

Dadurch kann ich mit minimalem Aufwand über die Größe der Zieldatei auf dem Laufenden bleiben.

Als Alternative für weniger triviale Situationen, z. B. das rekursive Kopieren von Verzeichnissen, können Sie eine watch du -hs DIRZusammenfassung der DIR-Größe anzeigen. Die Berechnung kann jedoch sehr lange dauern und das Kopieren sogar verlangsamen. Verwenden Sie daher möglicherweise -n INTERVALArgumente, um zu überwachen, dass ein Kompromiss akzeptabel ist.

Update: Wenn Sie Platzhalter mit dem Befehl watch du verwenden, watch du -hs backup/*vergessen Sie zB nicht, Folgendes anzugeben:

watch "du -hs backup/*"

Andernfalls werden die Platzhalter nur einmal erweitert , wenn die Überwachung gestartet wird, sodass keine neuen Dateien / Unterverzeichnisse angezeigt werden.

Alois Mahdal
quelle
Antwortet jedoch nicht auf den Teil "Geschwindigkeit" ...
Alois Mahdal
7

dd status=progress

Option in GNU Coreutils 8.24+ (Ubuntu 16.04) hinzugefügt:

dd if=src of=dst status=progress

Das Terminal zeigt eine Zeile des Typs:

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

Siehe auch: Wie können Sie den Fortschritt von dd überwachen?

Ciro Santilli ist ein Schauspieler
quelle
1
Sie meinten: stdout ist ein Strom von Zeichen und vt100-Escape-Sequenzen, mit denen Ihr Terminal eine regelmäßig aktualisierte Zeile anzeigt ;). stdout ist immer ein Strom von Bytes und hat nichts damit zu tun, wie es angezeigt wird (außer dass die Anwendung wissen kann, ob es derzeit an ein Terminal angeschlossen ist oder nicht ...)
masterxilo
@ Masterxilo Newbs wird es nicht interessieren, Experten werden wissen ;-) hehe
Ciro Santilli
Nun, ich denke, es ist immer gut, Dinge so auszudrücken, wie sie sind, vielleicht einige Details auszulassen, aber niemals Ihre Leser dazu zu bringen, ein falsches mentales Modell zu produzieren. Wenn Sie sagen, dass "stdout eine (regelmäßig aktualisierte) Zeile ist", scheint es, als ob Sie sagen, dass stdout ein Block veränderlichen Speichers ist, der es nicht ist. Dies ist auch für Neulinge wichtig zu wissen.
Masterxilo
6

Wenn Sie über rsync 3.1 oder höher ( rsync --version) verfügen , können Sie kopieren (cp -Rpn), während die Berechtigungen und der Besitz erhalten bleiben, Verzeichnisse wiederverwenden, "kein Datenverlust" und den Gesamtfortschritt (anstatt nur den Fortschritt nach Datei), die Kopierrate und ( sehr grob) geschätzte verbleibende Zeit mit:

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

Beachten Sie, dass sudo nur benötigt wird, wenn Sie sich mit Verzeichnissen / Dateien befassen, die Sie nicht besitzen. Ohne das --no-i-rSymbol wird der Prozentsatz möglicherweise während des Kopiervorgangs auf einen niedrigeren Wert zurückgesetzt. Möglicherweise wird in späteren Versionen von rsync standardmäßig no-ir mit info = progress2 verwendet, dies ist jedoch in der aktuellen Version von 3.1.2 nicht der Fall.

Ich habe festgestellt, dass der Prozentsatz und die verbleibende Zeit stark überschätzt werden, wenn in ein Verzeichnis kopiert wird, das bereits Dateien enthält (z. B. wenn Sie normalerweise cp -n "no clobber" verwenden würden).

S Lentz
quelle
3

Verwenden Sie ein Shell-Skript:

#!/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
}

Das wird so aussehen:

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

Quelle

Jan
quelle
3

Je nachdem, was Sie tun möchten, könnte Midnight Commander ( mc) die Antwort sein. Ich bin überrascht, dass es noch nicht erwähnt wurde.

Tools wie pvoder rsynceignen sich gut, um den Fortschritt der Übertragung einer großen Datei anzuzeigen, aber wenn es darum geht, ganze Verzeichnisse / Bäume zu kopieren, mcberechnet sie die Größe und zeigt dann den Fortschritt sehr gut an. Außerdem ist es auf den meisten Systemen sofort verfügbar.

kralyk
quelle
2
"Es ist auf den meisten Systemen sofort verfügbar." ... nicht auf einer Standard-Ubuntu-Installation.
Muru
1

Eine weitere Option zum Beibehalten von Attributen könnte sein (wenn sourcees sich um einen Ordner handelt, in dem er erstellt wird destination).

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

hoffe, es kann jemandem nützlich sein. Um eine geschätzte Übertragungszeit zu erhalten, kann dies erreicht werden, indem dies do -s sourceim Voraus durchgeführt und als -s <size>Parameter an übergeben wird pv.

Ciekawy
quelle
-f -ist überflüssig. tarDie Standardausgabe für cund die Standardeingabe für xsind stdout und stdin.
Muru
Kann es von der OS / tar-Version abhängen? Ich weiß, dass es sich um eine Ubuntu-Site handelt, aber dies kann für andere Betriebssystembesitzer wie macOS nützlich sein
ciekawy
1
Nee. Alle vernünftigen Implementierungen (einschließlich libarchives tar, das von macOS verwendet wird) weisen dieses Verhalten auf.
Muru
habe gerade auf macos verifiziert und dein vorschlag ist vollkommen gültig - ich habe meine antwort aktualisiert. Vielen Dank!
Ciekawy
0

Sie können jedes Programm kopieren. Gleichzeitig können sudo iotopSie die tatsächliche Lese- / Schreibgeschwindigkeit der Festplatte noch ohne Fortschritt anzeigen.

McKelvin
quelle
0

Überprüfen Sie den Quellcode für progress_bar im folgenden Git-Repository

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

Probieren Sie auch das Custom Bash Script Package Supreme aus

Laden Sie die Deb-Datei herunter und installieren Sie sie in einer Debian-basierten Distribution oder laden Sie die Quelldateien herunter, ändern Sie sie und verwenden Sie sie für andere Distributionen

Funktionsübersicht

(1) Öffnen Sie Apps ---- Firefox ---- Rechner ---- Einstellungen

(2) Dateien verwalten ---- Suchen ---- Navigieren ---- Schnellzugriff

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

(3) Verwalten des Telefons ---- Verschieben / Kopieren vom Telefon ---- Verschieben / Kopieren zum Telefon ---- Synchronisieren von Ordnern

(4) USB verwalten ---- Von USB verschieben / kopieren ---- Auf USB verschieben / kopieren

KIRAN B
quelle
0

pv weiß, wie man Dateideskriptoren überwacht, denen eine pid gegeben wurde, egal ob es sich um cp oder etwas anderes handelt

Aus der Dokumentation:

   (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

Beispiel:

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
quelle