Wie kann ich Dateien verschieben und den Fortschritt anzeigen (z. B. mit einem Fortschrittsbalken)?

118

Gibt es beim Verschieben großer Verzeichnisse mveine Möglichkeit, den Fortschritt (%) anzuzeigen? Der cpBefehl auf gentoo hatte einen -gSchalter, der den Fortschritt anzeigt .

letronje
quelle
3
Die Messung des Rohrdurchsatzes in der Shell könnte hilfreich sein, obwohl ich nicht weiß, ob es möglich ist, diese Tools beim Verschieben einer Datei einfach zu verwenden
Michael Mrozek

Antworten:

50

Sie können ein gepatchtes cp und mv erstellen, die dann beide die Option -g unterstützen, um den Fortschritt anzuzeigen. Auf dieser Seite finden Sie Anweisungen und Patches . Allerdings : Die Seite fordert Sie dazu auf

$ sudo cp src/cp /usr/bin/cp
$ sudo cp src/mv /usr/bin/mv

das überschreibt die ursprünglichen cp und mv. Dies hat zwei Nachteile: Erstens, wenn ein aktualisiertes Coreutils-Paket auf Ihrem System ankommt, werden sie überschrieben. Zweitens, wenn die gepatchte Version ein Problem hat, können sie Skripte unterbrechen, die auf Standard-CP und -MV basieren. Ich würde lieber so etwas machen:

$ sudo cp src/cp /usr/local/bin/cpg
$ sudo cp src/mv /usr/local/bin/mvg

Dadurch werden die Dateien nach / usr / local / bin kopiert, das für vom Benutzer kompilierte Programme vorgesehen ist, und ihnen wird ein anderer Name gegeben. Wenn Sie also einen Fortschrittsbalken wünschen, sagen Sie mvg -g bigfile /mnt/backupmv und verwenden es normal.

Außerdem kannst du alias mvg="/usr/local/mvg -g"dann nur noch sagen mvg bigfile /mnt/backupund direkt den Fortschrittsbalken bekommen.

fschmitt
quelle
2
Leider ist der Patch auf dieser Seite nicht mehr vorhanden und scheint nicht im Webarchiv indiziert zu sein. Es scheint viele Patches mit einem ähnlichen Namen und einer ähnlichen Funktion zu geben . Können Sie Ihre Antwort bearbeiten, um zu klären, welche Sie gemeint haben?
Gilles
Ich denke, github.com/atdt/advcpmv ist ein gültiger Nachfolger und es hat den gleichen Patch, so dass ich den Link geändert habe, um darauf zu verweisen.
Fschmitt
93

Ich mag die Idee nicht, Binärdateien von coreutil zu überschreiben, wenn es einfachere Lösungen gibt, also hier meine:

rsync : Rsync kopiert Dateien und hat einen -PSchalter für einen Fortschrittsbalken. Wenn Sie also rsync installiert haben, können Sie einen einfachen Alias ​​in Ihrer Shells-Dot-Datei verwenden:

alias cp='rsync -aP'

Der Nachteil ist, dass rsync etwas langsamer ist als cp, aber Sie sollten dies mit der Zeit messen und selbst entscheiden, ich kann damit leben :-)

Shell-Skript : Ein Shell-Skript kann auch den Fortschrittsbalken erstellen. Ich habe das vor einiger Zeit im Internet gefunden und erinnere mich nicht an die Quelle:

#!/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% [===============================>                      ]

bar :

'bar' - 'cat' mit ASCII-Fortschrittsbalken

barist ein kleines Shell-Skript zum Anzeigen einer Prozessleiste für alle Arten von Vorgängen (cp, tar usw.). Beispiele finden Sie auf der Projekthomepage.

Es ist auch für die Bourne-Shell geschrieben, damit es überall in der Nähe läuft.

Echox
quelle
3
barwickelt mvnoch nicht ein
Tobu
5
Gutschrift für das Shell-Skript
Lamnk
1
Beachten Sie, dass rsyncdies nicht mvvollständig ersetzt (das OP fragt nach), insbesondere wenn es um schnelle Kopien auf Copy-on-Write-Dateisystemen wie geht btrfs.
Karl Richter
74

Es gibt ein neues Tool mit dem Namen progress, mit dem jeder Deskriptor gefunden werden kann, der sich auf einen laufenden Befehl bezieht, und das den Fortschritt und die Geschwindigkeit anzeigt: hier verfügbar

progress -w

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

naugtur
quelle
3
WOW, ich hätte nicht gedacht, dass das so großartig wird! Ich habe progressnach der Installation einfach getippt und es hat mir den Fortschritt für den mvBefehl angezeigt, auf den ich gerade gewartet habe. Vielen Dank!
Redd
3
Vielen Dank! Wenn Sie Dinge als Root verschieben, müssen Sie anscheinend sudodenselben Benutzer verwenden (denke ich) - Sie können auch verwenden watch, um alle 2 Sekunden zu sagen, was passiert:watch progress -w
Wilf,
6
Tolles Programm, aber wenn man zB einen Ordner mit vielen Dateien verschiebt, wird nur der Fortschritt der aktuellen Datei angezeigt, nicht der gesamte Ordner. Stattdessen watch progress -wkannst du auch einfachprogress -m
mxmlnkn 13.11.16
6
IMHO, dies ist der einfachste Weg, um das Problem zu lösen. Anstatt Coreutils zu patchen oder Tools zu verwenden, die nicht für bestimmte Zwecke vorgesehen sind (wie rsync für mv) oder überflüssige Skripte zu schreiben, verwenden Sie einfach das für den jeweiligen Zweck geschriebene Tool mit Liebe.
Trauer
34

Sie können den Befehl pipe viewer verwendenpv , um den Fortschrittsbalken anzuzeigen:

pv /original/file > /new/file

Ich benutze dies oft, um eine große Datei über ein bereitgestelltes Netzwerkdateisystem zu kopieren (mit gzipund kombinieren tar). Der Nachteil ist, dass Sie nur eine Datei und kein Verzeichnis kopieren können . Und Sie müssen der neuen Datei einen Namen geben, Sie können nicht einfach das Zielverzeichnis angeben, wie es der cpFall ist. Das Kopieren ist jedoch nicht pvdas Ziel. Es ist ein leistungsfähiges Werkzeug und kann viel mehr als nur Dateien kopieren. Weitere Beispiele finden Sie auf der Homepage von pv.

Eine viel bessere Option ist die Verwendung rsync -aP. Wenn Sie mvstattdessen möchten , hängen Sie das Flag an --remove-source-files. Fügen Sie dies hinzu, .bashrcwenn Sie die Befehle häufig verwenden möchten:

alias rscp='rsync -aP'
alias rsmv='rsync -aP --remove-source-files'

Der Nachteil hier ist, dass rsync nur den Fortschritt anzeigt, keine Fortschrittsanzeige.

Lamnk
quelle
tar cf - source-dir | pv | tar xf - -C out-dirgibt Ihnen den Durchsatz eines ganzen Verzeichnisses. Wenn Sie die Größe kennen und -san pv übergeben, können Sie auch Fortschritte erzielen.
Arantius
6

Wenn es Ihr Ziel ist, ein Verzeichnis mit Fortschrittsanzeige zu verschieben / zu kopieren, aber keine nicht-terminale Benutzeroberfläche zu verwenden, ist mc (Midnight Commander) eine gute Wahl.

Christian Madsen
quelle
3

Meine Lösung ist zu verwenden rsync. Es kann Verzeichnisse kopieren, die Quelldateien nach einem erfolgreichen Kopiervorgang entfernen (und sie so "verschieben") und unter anderem Fortschrittsberichte anzeigen (insbesondere teilweise kopierte Verzeichnisse synchronisieren und über das Netzwerk arbeiten).

So würde ich ein Verzeichnis mit rsync und einem Fortschrittsbericht verschieben:

rsync -aP --remove-source-files $src $dst && rm -r $src

Stellen Sie sicher, $srcdass Sie nicht mit einem Backslash enden, sonst erhalten Sie eine andere Bedeutung als die von GNU cp.

Das rm -ram Ende wird benötigt, weil --remove-source-fileserst die Quelldateien entfernt werden, nachdem jede erfolgreich kopiert wurde, nicht die Verzeichnisse. Das &&stellt sicher, dass es nur ausgeführt wird, wenn rsync erfolgreich abgeschlossen wurde. Wenn Sie paranoid sind, können Sie es durch eine Art rekursives ersetzen rmdir, wie zfind $src -d -exec rmdir {} +

Der einzige Nachteil ist, dass die -POption den Fortschritt für jede Datei anzeigt, nicht für den gesamten Kopiervorgang. Dies kann unbrauchbar sein, wenn Sie versuchen, ein Verzeichnis mit vielen kleinen Dateien zu verschieben. Die neueste Entwicklungsversion von rsync verfügt über ein alternatives Flag --info=progress2, das den Fortschritt für den gesamten Vorgang anzeigt.

Tobia
quelle
2

Um zu vermeiden, dass Coreutil-Patches hinzugefügt werden, um den Fortschrittsbalken zu mvund hinzuzufügen cp, ist gcp(Goffi's CoPier) eine neue Alternative: http://wiki.goffi.org/wiki/Gcp/en

Verwendung wie cpbei Optionen -rfür die Rekursivität und -vfür die Ausführlichkeit.

Es verwendet eine Dateiwarteschlange, wenn mehrere Befehle gleichzeitig aufgerufen werden. Außerdem können kopierte Dateinamen in einem Protokoll aufgezeichnet werden. Weitere Informationen finden Sie im Abschnitt Manpage zum Speichern von Quellen .

Hier ist ein gutes Tutorial für den Einstieg gcp: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/

Yves Martin
quelle
Gibt es gmv wie gcp für cp?
CodyChan
Ich habe kein Äquivalent gefunden. Übrigens, es ist keine Fortschrittsanzeige erforderlich, wenn "mv" auf einem einzelnen Dateisystem ausgeführt wird ... es ist ziemlich schnell. Wenn das Verschieben auf zwei verschiedene Dateisysteme erfolgt, wird es als cp implementiert und entfernt die Quelle, wenn dies erfolgreich ist, oder das Ziel, wenn dies fehlschlägt. Ein einfaches Shell-Skript, das auf gcp basiert, kann dies ordnungsgemäß ausführen (mit einer ersten Überprüfung, ob sich Quelle und Ziel wirklich auf unterschiedlichen Dateisystemen befinden)
Yves Martin,
2

Zunächst einmal: Ich kopiere keine großen Dateien ohne ionice, es sei denn, ich weiß, dass ich den Computer eine halbe Stunde oder länger nicht benutzen möchte.

Zweitens: Alle meine Partitionen werden aufgezeichnet, sodass das Kopieren innerhalb von Partitionen keine Zeit in Anspruch nimmt. Wenn es eine lange Kopie ist mache ich eine du -smauf die Dateien und df -m | grep copy_to_partition. Wenn ich dann neugierig bin, wie lange es noch dauern wird, mache ich das noch dfeinmal und sehe, wie viel von den Dateien kopiert wurde.

HandyGandy
quelle
Möchten Sie Ihre ionice Tipps teilen? Welche Priorität würdest du mv cpu-weise und disk i / o weise geben? Hier sind meine Einstellungen, aber die CPU-Auslastung ist auch nach dem Umbenennen immer noch hoch: imgur.com/a/DLMJplz
ychaouche
2

Auf meiner Mint verwende ich gerne gcp für diese oder die Curl-Lösung (was wirklich nett ist)

gcp SOURCE DESTINATION

Möglicherweise müssen Sie es installieren sudo apt-get install gcp

Und eine sehr schöne und hervorragende Aufgabe für den Fortschrittsbalken mit Infos zu

  • % Gesamt
  • % Empfangen
  • % Xferd
  • Durchschnittliche DL
  • Speed ​​Upload
  • Übrige Zeit
  • Zeitaufwand
  • Gesamtzeit
  • Momentane Geschwindigkeit

in einem gut lesbaren Format ist:

curl -o DESTINATION FILE://source

Möglicherweise müssen Sie es auch zuerst installieren sudo apt-get install curl

ThePentadactyl
quelle
gcpunterstützt das Verschieben von Dateien nicht, dh Quelldateien müssen nach erfolgreichem Kopieren manuell entfernt werden.
Karl Richter
2

Dies gibt Ihnen keinen Fortschrittsbalken, aber drücken CTRL-TSie und Sie senden einen SIGINFOan mv, der meldet, an welcher Datei gearbeitet wird und wie weit der Prozess fortgeschritten ist. Ziemlich praktisch, um dies für große Dateiübertragungen zu haben, möglicherweise nicht so nützlich für eine Übertragung mit vielen kleinen Dateien.

Ein kurzes Beispiel:

mv 135/61 /Volumes/Jules/135/
# hit C-t
load: 1.08  cmd: cp 35470 uninterruptible 0.00u 0.04s
135/61/1/1-s2.0-S006738-main.pdf -> /Volumes/Jules/135/61/1/1-s2.0-S006738-main.pdf  68%
Charles
quelle
1
Das hat bei mir nicht INFO: unknown signal; killall -l lists signals. geklappt : Ich glaube, SIGINFO ist nur auf einigen BSDs verfügbar, nicht im Standard-POSIX.
Brian Minton
2
Richtig. Es funktioniert unter Mac OS X, aber wahrscheinlich nicht unter Ubuntu.
Charles
1

Dient mv -vzum Drucken einer Zeile pro verschobener Datei und pv -lzum Drucken des Fortschritts basierend auf der Zeilenzahl (in Kraft der Anzahl der Dateien).

Sie benötigen pv(Pipe Viewer): http://www.ivarch.com/programs/pv.shtml

mv -v sourcedir targetdir | pv -l -s filecount > logfile

Verwenden Sie den folgenden Befehl, um die Anzahl der Dateien abzurufen:

find sourcedir | wc -l

Dieser Befehl zeigt Fortschrittsinformationen basierend auf der Anzahl der kopierten Dateien an. Dies funktioniert am besten, wenn es viele kleinere Dateien gibt. Wenn es nur wenige Dateien gibt, die riesig sind, werden Sie nicht viel Spaß haben.

Beachten Sie, dass mvauf der gleichen Partition schnell sein sollte. mvauf eine andere Partition wäre das gleiche wie cp source targetgefolgt von rm source. Hier sind also zwei Befehle zum Kopieren von Verzeichnissen mit Fortschrittsinformationen.

So melden Sie den Fortschritt basierend auf der Anzahl der kopierten Dateien:

cp -av sourcedir targetdir | pv -l -s filecount > logfile

So melden Sie den Fortschritt anhand der kopierten Bytes:

tar c sourcedir | pv -s size | tar x -C targetdir

Weitere Informationen finden Sie hier: Fortschrittsinformationen über pv für die Verzeichniskopie

Lesmana
quelle
1

Ausnahmslos suche ich nach dieser Antwort, nachdem ich den Befehl 'mv' gestartet habe. An diesem Punkt möchte ich sie nicht erneut starten. Wenn Sie in dieser Situation sind, können Sie den Fortschritt auf sehr einfache Weise überwachen (oder feststellen, ob es weit genug ist, dass es sich nicht lohnt, ihn zu töten), indem Sie Folgendes ausführen:

du -hs /directory/you're/moving/data/to

Dadurch wird nur die Größe des Verzeichnisses gedruckt, sodass Sie sehen können, wie viele Daten kopiert wurden, oder Sie können es einige Male ausführen, um zu sehen, wie schnell die Daten übertragen werden.

Qazmonk
quelle