Ist es möglich, die Kopiergeschwindigkeit und den Kopierprozentsatz zu sehen?

251

Ich habe Probleme beim Kopieren großer Dateien mit Nautilus (es bleibt hängen). Ich muss kopieren, mit cp. Ich würde gerne wissen, ob es irgendwelche Parameter gibt, die den kopierten Prozentsatz und auch die Übertragungsgeschwindigkeit anzeigen.

yzT
quelle
39
Sie könnten rsyncanstelle von verwenden cp. Es hat eine --progressOption.
Frostschutz
2
Midnight Commanderfunktioniert auch gut und hat eine hübsche textbasierte Benutzeroberfläche mit Fortschrittsbalken, ist aber möglicherweise nicht installiert. Versuchen Sie es mcan der Eingabeaufforderung. Offensichtlich auch nicht cp.
einen Lebenslauf vom
3
Die Verwendung von rsyncwith --progresshat mich dazu gebracht, herauszufinden, was gerade passiert. Es bleibt hängen, wenn es 100% erreicht, und dauert dann am Ende ein paar Minuten. Ich denke, es ist dasselbe, was mit Nautilus passiert. Wie auch immer, das ist bereits eine andere Frage. Die beste Antwort für diese Frage ist die rsync --progress: Größe,%, Geschwindigkeit und verstrichene Zeit.
yzT
2
Ein Problem bei rsync ist, dass es langsamer läuft als eine reine Kopie. Auf meinem großen Server beträgt der Unterschied 60 MB / s bzw. 300 MB / s.
PDWalker
1
@pdwalker auch mit der -WOption? Auf allen meinen Hosts rsyncist es fast so schnell wie cp... so nah nutze ich regelmäßig rsyncstatt cp.
Skaperen

Antworten:

193

rsynchat ein Flag aufgerufen, progress2das den Gesamtprozentsatz zeigt:

rsync --info=progress2 source dest
yzT
quelle
5
--info = progress2 hat es immer noch nicht in ein Standard-Repository geschafft und hier ist es 2015. Scheint eine gute Idee zu sein.
Lonniebiz
1
--info=progress2endlich aufgenommen am version 3.1.0 protocol version 31. Vielleicht könntest du deine Antwort bearbeiten, yzT.
Sopalajo de Arrierez
1
Mir ist aufgefallen, --info=progress2dass Rsync blitzschnell ist! 200 MB / s, während Windows 90 MB / s nicht überschreitet!
ReneFroger
1
@ReneFroger Obwohl dies die tatsächliche Geschwindigkeit sein kann (abhängig vom Gerät), ist diese Geschwindigkeit unter Linux häufig falsch. Nach Abschluss des Kopiervorgangs schreibt das System weiterhin auf das Gerät, anders als unter Windows, wenn Sie das Gerät auswerfen können fast sofort. Wenn Sie große Dateien kopieren, können Sie feststellen, wie es mit dieser Geschwindigkeit beginnt, aber dann geht es bis zum Standard.
yzT
7
es hat bei mir einfach geklappt --progress. rsync version 3.0.9
adrianTNT
103

Wenn Sie andere Tools zulassen, ist cpdies mit Sicherheit möglich. Für eine einzelne Datei können Sie verwenden pv. Es ist ein kleines Tool, das nette Statistiken liefert.

pv inputfile > outputfile

Wenn Sie mehrere Dateien oder Verzeichnisse haben, können Sie tar verwenden:

tar c sourceDirectory | pv | tar x -C destinationDirectory

Sie können es in eine Shell-Funktion einbinden. Es ist weniger zu tippen und die Semantik kommt denen von sehr nahe cp. Hier ist eine sehr einfache (und nicht fehlersichere!) Funktion:

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

Beachten Sie, dass einige Versionen von tardie oben genannte Syntax nicht unterstützen (z. B. Solaris tar) und Sie die folgende Variante verwenden müssen:

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

Du nennst es so

cpstat sourceDirectory destinationDirectory

Sie können es weiter verbessern, um pveine Schätzung der verbleibenden Zeit zu erhalten.

Eine andere Lösung (wie frostschutz in einem Kommentar erwähnt) ist die Verwendung von rsync mit der --progressOption:

rsync --progress -a sourceDirectory destinationDirectory
Marco
quelle
1
cpstat geht in den Pastebin =)
Matt
7
Dies gibt Ihnen Übertragungsgeschwindigkeit, aber keine ETA, da pvnicht bekannt ist, wie viele Daten durch die Pipe kommen werden. Sie können dies mit angeben -s. ZB zuerst tun , du -sh sourceDirectoryum eine (grobe) Idee zu bekommen, und dann geben sie an pv, wie folgt aus : pv -s 100m.
Jan Fabry
1
--info = progress2 gibt Ihnen eine Fortschrittsstatistik auf Verzeichnisebene.
AlexLordThorsen
vbuf(debian, ubuntu) ist ein gutes Stück schneller als pv, wahrscheinlich wegen seines virtuellen Ringpuffers
Skaperen
@ Kaperen Ich weiß es nicht vbuf. Aber wie es scheint, ist es momentan in Debian instabil und daher oft nicht auf Servern verfügbar, auf denen normalerweise Debian stable läuft.
Marco
58

rsync funktioniert am besten, um den Fortschritt während des Kopiervorgangs anzuzeigen.

Ex:

rsync -avh --progress sourceDirectory destinationDirectory
JustStoppingThrough
quelle
27

Wie in anderen Antworten erläutert, bietet cp diese Funktionalität nicht. Allerdings Fortschritt (früher cv) ist ein kleines Tool , das bei der Bereitstellung dieses fehlende Feature ist sehr hilfreich.

Dieses Tool kann als Tiny Dirty Linux Only * C-Befehl beschrieben werden, der nach grundlegenden Coreutils-Befehlen (cp, mv, dd, tar, gzip / gunzip, cat, ...) sucht und den Prozentsatz der auf Ihrem System ausgeführten Kopien anzeigt Daten.

Ich benutze es seit ein paar Monaten und es ist solide.

Amr Mostafa
quelle
scheint nicht mit allen Dateisystemen zu funktionieren (z. B. cifs), aber +1, wusste nicht, wie verrückt ting Exits
akostadinov
1
Beachten Sie, dass dieses Projekt jetzt "progress - Coreutils Progress Viewer (früher bekannt als cv)" heißt.
chappjc
17

Ist es möglich, die Kopiergeschwindigkeit und den Kopierprozentsatz zu sehen?

Ja, es ist möglich, den Fortschritt des Befehls cpauf dem Terminal anzuzeigen .


Methode 1: (verwenden progress)

Öffnen Sie ein neues Terminal, und geben progressSie Folgendes ein, um den Fortschritt des cpBefehls und anderer Befehle anzuzeigen :

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

Wenn Sie nicht installiert progress, können Sie es aus dem Repository installieren, zum Beispiel in dem CentOSmit diesem Befehl: yum -y install progress.

Öffnen Sie dann nach dem Ausführen des cpBefehls im Hintergrund oder nach dem cpnormalen Ausführen ein anderes Terminal. Probieren Sie einfach diesen Befehl aus:

# progress -m

Siehe Ausgabe:

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

Methode 2: (Patch verwenden cp)

Oder laden Sie die GNU herunter coreutilsund patchen Sie sie.

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

Lauf:

export FORCE_UNSAFE_CONFIGURE=1
./configure
make

Kopieren Sie die beiden Dateien cpund mvverschieben Sie sie coreutils-8.21/src/nach /usr/local/bin:

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

Oder kopieren Sie es mit Ihrem Dateimanager als root

Fügen Sie die folgenden Zeilen zu Ihrem hinzu ~/.bashrc:

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

Abmelden und Anmelden

Der Fortschrittsbalken kann ohne das vom Autor empfohlene –goder angezeigt werden–progress-bar

Siehe Ausgabe:

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 %

Quelle: linuxhelp

GAD3R
quelle
1
Dies sieht aus wie die wahre Quelle des cpPatches: web.archive.org/web/20131115171331/http://beatex.org/web/…
Kaushal Modi
1
+1 für den Hinweis auf progressBefehl
Peter
Dies ist die einzig wahre Antwort
Alessio
14

Bemerkt, dass dieser Beitrag etwas alt war. Aber als ich eine Lösung für das vorliegende Problem fand, dachte ich, ich würde meine Lösung veröffentlichen.

Szenario: Wir haben eine sehr große Verzeichnisstruktur, die wir kopieren möchten. Deshalb geben wir den Befehl cp -R sourcedir destdir in einem Terminalfenster aus.

Öffnen Sie ein anderes Terminalfenster oder schieben Sie den Prozess in den Hintergrund (Ctrl+Z,bg<CR>), und lassen Sie uns einen Fortschrittsindikator wie im Ghetto erstellen:

Wir erhalten zuerst die Gesamtgröße der Verzeichnisstruktur, die wir kopieren möchten. Dies tun Sie mit:

du -sh /path/sourcedirectory/

Konvertieren Sie das Ergebnis in Gigabyte (G) und ersetzen Sie das Ergebnis in der Variablen sourcesize durch das n. Führen Sie den folgenden Befehl aus, nachdem Sie sourceize und destdir (Zielverzeichnis) eingefügt haben.

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

Dadurch wird der Fortschritt alle 10 Sekunden mit folgenden Meldungen gedruckt:

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

Ich bin mir bewusst, dass diese Lösung nicht die Geschwindigkeit des Kopierens ansprach, aber es wäre möglich, dies hinzuzufügen, indem Sie die obigen Befehle erweitern und sie möglicherweise in ein Bash-Skript umwandeln, damit sie leichter zu lesen sind. Zum Beispiel durch Überprüfen, wie viele Daten kopiert werden. In Zeiteinheiten sollte die Geschwindigkeit für die Berechnung und Anzeige trivial sein.

NordicViking
quelle
Dies ist eigentlich perfekt für meinen Anwendungsfall, also danke, dass du es gepostet hast! Ich möchte über den Fortschritt des Kopierens eines riesigen Verzeichnisses mit Tausenden von Dateien und nicht nur einer Datei informiert werden. Die anderen Lösungen helfen mir also nicht wirklich.
Ibrahim
Dies ist großartig, insbesondere in Fällen wie dem, in dem ich gerade bin: Remote hat einen riesigen MV-Job gestartet, um Terrabytes an Backups von einem Speicherpool in einen anderen zu verschieben, ohne vorher über die Auswirkungen nachdenken zu müssen. Jetzt kann ich den Prozess einfach im Hintergrund betrachten und einen Blick darauf werfen. Genial!
Riley
8

Um die Antwort von Marco zu verbessern, habe ich heute diese Version von geschrieben cpstat, damit Sie viele Verzeichnisse kopieren und den letzten Parameter als Zielpfad verwenden können. Beachten Sie, dass Sie dank der Verwendung eines relativ tiefen Pfads als Quelle tarautomatisch denselben abhängigen Verzeichnisbaum erstellen können.

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
quelle
6

Nicht in einer Standardversion von cp.

Sie können den cp im Hintergrund anzeigen und die Größe auflisten, während Sie auf cpden Abschluss warten .

Ich verwende dieses Perl , um das Wachstum einer einzelnen Datei zu überwachen, aber es läuft extern zum cp (oder was auch immer ich sonst tue)

Matt
quelle
5

Auch wenn rsyncSie einige Fortschrittsstatistiken erhalten, sollten Sie diese verwenden, wenn Sie eine Fortschrittsanzeige wünschen pv.

Sie können cpveinen Wrapper pvmit einer einfacheren Syntax verwenden, der cpdemjenigen ähnelt, mit dem Sie Verzeichnisse rekursiv kopieren können

Bildbeschreibung hier eingeben

Sie können es hier bekommen

nachoparker
quelle
+1 für den Hinweis auf pv. Nizza zu finden!
Peter
4

Die Verwendung eines Tools wie mc(Mitternachtskommandant) kann eine gute Alternative zu anderen Antworten sein.

Es ist ein einfacher Dateimanager, der Ihnen den Fortschritt beim Kopieren / Verschieben anzeigt.

jseals
quelle
4

dd status=progress

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

dd if=src of=dst status=progress

Stdout ist eine regelmäßig aktualisierte Zeile wie:

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

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

Ciro Santilli ist ein Schauspieler
quelle
4

Eine andere einfache Lösung besteht darin , den Ausgabeordner wie folgt zu überwachen :

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

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

Dieses praktische Dienstprogramm wird ausgeführt duund zeigt die Unterschiede auf.

Eine andere mögliche Lösung wäre, ein einfaches Skript zu schreiben, das Schleifen durchführt, dueine grobe Schätzung des Durchsatzes aufruft und ausgibt.

Timothy C. Quinn
quelle
3

Bei diesem Tool handelt es sich um ein Linux-Dienstprogramm, das nach Coreutils-Grundbefehlen (cp, mv, dd, tar, gzip / gunzip, cat usw.) sucht und den Prozentsatz der kopierten Daten anzeigt:

https://github.com/Xfennec/cv

saidi
quelle
1
Dies wurde bereits im November '14 von @AmrMostafa vorgeschlagen.
Dubu
2

Ich hatte gerade einen Fall, in dem cp aufgrund eines FUSE-Fehlers im empfangenden Dateisystem mehr oder weniger blockiert war.

Wenn Sie nicht einfach von cp wechseln können (dh weil --sparse = always) und etwas wollen, das für den Fortschritt tatsächlich zuverlässig ist, gehen Sie über / 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
quelle
0

VCP - Kopieren von Dateien in eine Curses-Oberfläche (Fortschrittsbalken unter Linux anzeigen).

BESCHREIBUNG : vcp kopiert Dateien und Verzeichnisse in einer Curses-Oberfläche, wobei nur Textausgaben verfügbar sind. Die Optionen und die Ausgabe ähneln denen von BSD, es wurden jedoch einige neue Funktionen hinzugefügt.

Es bietet Informationen zu:

  • Dateien kopiert und zum Kopieren gelassen
  • geschriebene Daten und Gesamtdatengröße
  • Daten werden jede Sekunde geschrieben
  • Zwei Statusleisten, eine mit aktuellem Dateistatus, die andere mit Gesamtstatus (außer bei 1 Datei, beide mit aktuellem Status) und Prozent

Wenn die Ausgabe an die Konsole gesendet wird:

  • eine Statusleiste
  • Größe kopiert und Geschwindigkeit

VCP-Manpage: https://linux.die.net/man/1/vcp

Laden Sie vcp-2.2.tar.gz herunter von:

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

Abhängigkeit: curses.h (libncurses-dev).

Installieren Sie unter Ubuntu:

sudo apt-get install libncurses-dev

oder

sudo apt-get install libncurses5-dev

INSTALL VCP:

make && make install

Handbuch:

man vcp
user350351
quelle