Wie zeigen Sie den Übertragungsfortschritt und die Geschwindigkeit beim Kopieren von Dateien mit cp?

271

Gibt es sonst ein anderes Befehlszeilen-Dienstprogramm, das dies erreichen kann?

    
Olivier Lalonde 14.12.2010, 05:48

15 Antworten

204

Während cp diese Funktionalität nicht hat, können Sie pv dazu verwenden:

pv my_big_file > backup/my_big_file

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

In diesem Beispiel gibt pv im Grunde nur die Datei an stdout * aus, die Sie mit dem Operator > in eine Datei umleiten. Gleichzeitig werden Informationen über den Fortschritt an das Terminal ausgegeben.

So sieht es aus:

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

Sie müssen möglicherweise pv installieren (Geben Sie alternativ sudo apt-get install pv ) in Ihr System ein.

*: Das technische Bit

Es gibt drei wichtige Datenströme in einem unixartigen System: stdout (Standardausgabe), stderr (Standardfehler) und stdin (Standardeingabe). Jedes Programm hat sozusagen alle drei. Der Umleitungsoperator > leitet die Programmausgabe in eine Datei um. Ohne Argumente, wie Sie oben sehen, leitet > die Standardausgabe eines Programms in eine Datei um. cp macht grundsätzlich nichts schicker als

cat source > destination

(wobei cat gerade eine Datei liest und auf stdout ausgibt). pv ist genau wie cat, aber wenn Sie den Ausgabestream woanders umleiten, wird die Fortschrittsinformation stattdessen auf stdout gedruckt.

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

Eine weitere Option, wie DoR schlägt in diese Antwort vor , verwenden Sie stattdessen rsync:

$ 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 Berechtigungen / Besitzrechte der Dateien erhalten, während der Fortschritt angezeigt wird.

    
Stefano Palazzo 14.12.2010, 06:17
129

Es gibt kein. Sehen Sie hier nach, warum. Obwohl es mehr als Sie benötigt, hat rsync eins mit --progress -Parameter. Das -a behält die Berechtigungen usw. und -h wird für Menschen lesbar sein.

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 15.10.2012 10:06
84

Wenn Sie sehen wollen, ob Ihre Dateien korrekt übertragen werden, könnten Sie gcp und gcp wie cp verwenden, aber standardmäßig erhalten Sie einen Fortschrittsbalken, so dass Sie sehen können, was kopiert wird. Als Wiki-Notizen des Programms enthält gcp einige nützliche Funktionen wie

  
  • Übertragungsprogressionsanzeige
  •   
  • kontinuierliches Kopieren bei Fehler (zur nächsten Datei springen)
  •   
  • copy status logging: gcp protokolliert alle seine Aktionen, so dass man wissen kann, welche Dateien erfolgreich kopiert wurden
  •   
  • name mangling, um die Beschränkungen des Zieldateisystems zu umgehen (z. B. Löschen von inkompatiblen Zeichen "*" oder "?" auf FAT)
  •   

Aber selbst wenn der Fortschrittsbalken bei Verwendung des Tools 100% erreicht hat, müssen Sie warten, bis Ihre Terminal-Eingabeaufforderung erneut angezeigt wird, bevor Sie Ihr Medium sicher entfernen, damit Sie sicherstellen können, dass der Übertragungsvorgang erfolgreich abgeschlossen wurde.

gcp wird zum Kopieren von Dateien verwendet und hat Optionen wie --preserve , so dass verschiedene Attribute und Berechtigungen beibehalten werden können und --recursive , so dass ganze Verzeichnisse kopiert werden können. Weitere Informationen zu den Optionen finden Sie unter man gcp oder auf den Ubuntu-Hilfeseiten online Ein Tutorial ist auch verfügbar auf dieser Website .

Installieren Sie gcp aus den Repositories mit

sudo apt-get install gcp

( Hinweis : In Ubuntu 12.10 lautet 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 mit

auf Ihr Medium
gcp -rv ~/Podcasts /media/Mik2

Beispielausgabe von gcp mit 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 in man gcp sind viele weitere Optionen enthalten.

    
user76204 15.10.2012 13:09
53

Ich habe Lust, cURL für genau diesen Zweck zu verwenden. Die man-Seite listet das "FILE" -Protokoll als unterstützt auf, also verwende es einfach wie jedes andere Protokoll in einer URL:

curl -o destination FILE://source

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

    
mathemagician 02.02.2013 10:00
22

Während beim Kopieren mehrerer Dateien die Geschwindigkeit nicht angezeigt wird, enthält die Option -v für den Befehl cp Fortschrittsinformationen. z.B.

cp -rv old-directory new-directory
    
Ubuntourist 14.12.2010 18:17
19

Der Kernel kennt die meisten Daten wie Geschwindigkeit und oft auch Prozent. Moderne Kernel setzen dies über ihr / proc-Dateisystem frei.

showspeed von Pfandrecht nutzt diese Information. Es kann an bereits laufende Programme angehängt werden und periodische Updates wie folgt geben:

$ 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 25.02.2014 15:34
11

Während pv lokale cp -Tasks verarbeiten kann, kann dd mit pv sowohl mit lokalen ( cp ) als auch mit entfernten ( scp ) Tasks umgehen.

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

Bitte stellen Sie sicher, dass path/to/dest.mkv exits von touch path/to/dest.mkv

ist

Dies kann den Fortschritt anzeigen, aber wenn Sie die prozentuale Information möchten,

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

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

Hier kommt der entfernte Teil

Während scp den aktuellen Fortschritt kaum anzeigen kann, ist die Verwendung von dd mit pv ein Kinderspiel.

ssh [email protected] dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
    
onemach 05.01.2013 09:08
10

Es gibt ein neues Werkzeug namens cv, das einen beliebigen Deskriptor für einen laufenden Befehl findet und Fortschritt und Geschwindigkeit anzeigt: Pfandrecht

cv -w

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

    
naugtur 13.07.2014 13:33
10

In den Repositories gibt es ein Tool namens progress , das verschiedene Befehle prüfen und Fortschrittsinformationen für sie anzeigen kann.

Installieren Sie es mit dem Befehl

sudo apt-get install progress

Dieses Werkzeug kann so 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 27.09.2016 00:35
6

Wie schon gesagt, enthält cp diese Funktionalität nicht.

Nur um meine $ 0,02 zu werfen, was ich normalerweise mit einfachen Kopiersituationen mache (d. h. 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 DIR im Verzeichnis mit dem Ziel

  5. aus

Dies kann mich über die Zieldateigröße auf dem Laufenden halten, mit einem Minimum an Aufwand.

Als eine Alternative für weniger triviale Situationen, z.B. rekursiv Verzeichnisse kopieren, können Sie watch du -hs DIR verwenden, um die Zusammenfassung der DIR-Größe anzuzeigen. Allerdings kann die Berechnung lange dauern und das Kopieren sogar verlangsamt werden. Daher empfiehlt es sich, -n INTERVAL argument zu verwenden, um den Kompromiss zu akzeptieren.

Update: Falls Sie Wildcards mit Befehlen verwenden, die mit Watch du verwendet werden, z. watch du -hs backup/* , vergiss nicht zu zitieren:

watch "du -hs backup/*"

andernfalls werden die Platzhalter nur einmal erweitert, wenn gestartet ist, so dass du keine neuen Dateien / Unterverzeichnisse ansehen wirst.

    
Alois Mahdal 16.11.2012 14:20
4

dd status=progress

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

dd if=src of=dst status=progress

Stdout ist eine periodisch aktualisierte Zeile wie:

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

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

    
3

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

Werkzeuge wie pv oder rsync sind gut, um den Fortschritt der Übertragung einer großen Datei anzuzeigen, aber wenn es um das Kopieren ganzer Verzeichnisse / Bäume geht, berechnet mc die Größe und zeigt dann den Fortschritt sehr schön an. Außerdem ist es bei den meisten Systemen sofort verfügbar.

    
kralyk 30.01.2016 18:33
2

Verwenden Sie ein Shell-Skript:

#!/bin/sh
cp_p()
{
   strace -q -ewrite cp -- "" "" 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' "") count=0
}

Das wird wie folgt aussehen:

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

Quelle

    
Jan 01.09.2014 15:45
2

Wenn Sie rsync 3.1 oder höher haben ( rsync --version ), können Sie kopieren (cp -Rpn), während Sie Berechtigungen und Eigentumsrechte beibehalten, Verzeichnisse rekursieren, "no clobber" und den Gesamtfortschritt anzeigen (anstatt nur nach Datei zu verfahren) , Kopierrate und (sehr grobe) 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 mit Verzeichnissen / Dateien arbeiten, die Sie nicht besitzen. Ohne --no-i-r kann der Prozentsatz auch zu einem Zeitpunkt während der Kopie auf eine niedrigere Zahl zurückgesetzt werden. Vielleicht werden spätere Versionen von rsync standardmäßig auf no-i-r mit info = progress2 gesetzt, in der aktuellen Version von 3.1.2 jedoch nicht.

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

    
S Lentz 02.03.2016 23:22
0

Sie können ein beliebiges Programm kopieren. Gleichzeitig können Sie sudo iotop starten und die tatsächliche Lese- / Schreibgeschwindigkeit der Festplatte sehen, jedoch ohne Fortschritt.

    
McKelvin 11.01.2018 16:47

Tags und Links