it-swarm.com.de

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

Gibt es eine Möglichkeit, den Fortschritt (%) anzuzeigen, wenn große Verzeichnisse mit mv verschoben werden? Der Befehl cp auf gentoo hatte ein -g Schalter, der den Fortschritt anzeigt.

129
letronje

Sie können ein gepatchtes cp und mv erstellen, die dann beide den Schalter -g unterstützen, um den Fortschritt anzuzeigen. Es gibt Anweisungen und Patches unter diese Seite . Jedoch : Die Seite weist Sie an, dies zu tun

$ Sudo cp src/cp /usr/bin/cp
$ Sudo cp src/mv /usr/bin/mv

welches das ursprüngliche cp und mv überschreibt. Dies hat zwei Nachteile: Erstens werden überschriebene Coreutils-Pakete überschrieben, wenn sie auf Ihrem System eintreffen. 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 einen anderen Namen gegeben. Wenn Sie also einen Fortschrittsbalken möchten, sagen Sie mvg -g bigfile /mnt/backup und benutze mv normal.

Sie können auch alias mvg="/usr/local/mvg -g" dann musst du nur noch mvg bigfile /mnt/backup und erhalte direkt den Fortschrittsbalken.

50
fschmitt

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

rsync : Rsync kopiert Dateien und hat ein -P Schalter für einen Fortschrittsbalken. Wenn Sie also rsync installiert haben, können Sie einen einfachen Alias ​​in Ihrer Shells-Dotdatei 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% [===============================>                      ]

Balken :

'Bar' - 'cat' mit ASCII Fortschrittsbalken

bar ist 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, so dass es überall in der Nähe läuft.

96
echox

Es gibt ein neues Tool namens progress, das jeden Deskriptor für einen laufenden Befehl finden und Fortschritt und Geschwindigkeit anzeigen kann: hier verfügbar

progress -w

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

92
naugtur

Sie können Pipe Viewer Befehl pv verwenden, um den Fortschrittsbalken anzuzeigen:

pv /original/file > /new/file

Ich benutze dies oft, um eine große Datei über ein gemountetes Netzwerk-Dateisystem zu kopieren (kombiniert mit gzip und tar). Der Nachteil ist, dass Sie nur one Datei und nicht Verzeichnis kopieren können. Und Sie müssen der neuen Datei einen Namen geben, Sie können nicht einfach das Zielverzeichnis wie cp angeben. Das Kopieren ist jedoch nicht der Zweck von pv. Es ist ein leistungsstarkes Tool und kann viel mehr als nur Dateien kopieren. Weitere Beispiele für pv finden Sie auf der Homepage.

Eine viel bessere Option ist die Verwendung von rsync -aP. Wenn Sie stattdessen mv möchten, fügen Sie das Flag --remove-source-files. Fügen Sie dies Ihrem .bashrc wenn 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, keinen Fortschrittsbalken.

36
Lamnk

Wenn Sie ein Verzeichnis mit Fortschrittsbalken verschieben/kopieren möchten, aber nicht-terminale GUI vermeiden möchten, ist mc (Midnight Commander) eine gute Wahl.

6

Meine Lösung besteht darin, rsync zu verwenden. Es kann Verzeichnisse kopieren, die Quelldateien nach einer erfolgreichen Kopie entfernen (wodurch sie "verschoben" werden) und unter anderem Fortschrittsberichte anzeigen (insbesondere teilweise kopierte Verzeichnisse synchronisieren und über das Netzwerk arbeiten).

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

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

Stellen Sie sicher, dass $src nicht mit einem Backslash endet, da Sie sonst eine andere Bedeutung als die von erhalten GNU cp.

Das rm -r Am Ende wird benötigt, da --remove-source-files Nur die Quelldateien entfernt, nachdem jede erfolgreich kopiert wurde, nicht die Verzeichnisse. Der && Stellt sicher, dass er nur ausgeführt wird, wenn rsync erfolgreich abgeschlossen wurde. Wenn Sie paranoid sind, können Sie es durch eine Art rekursives rmdir ersetzen, z. B. find $src -d -exec rmdir {} +

Der einzige Fehler ist, dass die Option -P Den Fortschritt für jede Datei anzeigt, nicht für den gesamten Kopiervorgang. Dies ist möglicherweise nutzlos, 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.

4
Tobia

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

Zweitens: Alle meine Partitionen sind Jouranled, sodass das Kopieren innerhalb einer Partition keine Zeit in Anspruch nimmt. Wenn es eine lange Kopie ist, mache ich ein du -sm auf den Dateien und df -m | grep copy_to_partition. Wenn ich dann neugierig bin, wie viel Zeit es dauern wird, mache ich das df erneut und sehe, wie viel der Dateien kopiert wurden.

2
HandyGandy

Dies gibt Ihnen keinen Fortschrittsbalken, aber drücken Sie CTRL-T und Sie senden ein SIGINFO an mv, das angibt, an welcher Datei gearbeitet wird und wie weit es im Prozess 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.

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%
2
Charles

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

gcp SOURCE DESTINATION

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

Und eine sehr schöne und ausgezeichnete Aufgabe für den Fortschrittsbalken mit Informationen über

  • % Gesamt
  • % Empfangen
  • % Xferd
  • Durchschnittlicher DL
  • Speed ​​Upload
  • Übrige Zeit
  • Zeitaufwand
  • Zeit insgesamt
  • 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

2
ThePentadactyl

Um zu vermeiden, dass Coreutil gepatcht wird, um mv und cp einen Fortschrittsbalken hinzuzufügen, ist gcp (Goffis CoPier) eine neue Alternative: http: //wiki.goffi. org/wiki/Gcp/de

So verwenden Sie cp mit den Optionen -r für Rekursivität und -v für Ausführlichkeit.

Es wird eine Dateiwarteschlange verwendet, wenn mehrere Befehle gleichzeitig aufgerufen werden. Es ermöglicht auch das Aufzeichnen kopierter Dateinamen in einem Protokoll. Weitere Informationen finden Sie im Abschnitt Speichern der Quelle Manpage.

Hier ist ein gutes Tutorial, um mit gcp zu beginnen: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/

2
Yves Martin

Verwenden mv -v um eine Zeile pro verschobener Datei zu drucken und pv -l, um den Fortschritt basierend auf der Zeilenanzahl zu drucken (tatsächlich die 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 viele kleinere Dateien vorhanden sind. Wenn es nur wenige Dateien gibt, die riesig sind, werden Sie nicht viel Spaß haben.

Beachten Sie, dass mv auf derselben Partition schnell sein sollte. mv zu einer anderen Partition wäre dasselbe wie cp source target gefolgt von rm source. Hier sind zwei Befehle zum Kopieren von Verzeichnissen mit Fortschrittsinformationen.

so melden Sie den Fortschritt anhand 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

1
lesmana

Am Ende suche ich immer nach dieser Antwort nach Ich starte den Befehl 'mv'. An diesem Punkt möchte ich ihn nicht erneut starten. Wenn Sie sich in dieser Situation befinden, können Sie auf sehr einfache Weise den Fortschritt überwachen (oder feststellen, ob es weit genug ist, dass es sich nicht lohnt, ihn zu töten):

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.

1
qazmonk

Ich verwende das folgende Skript, das mit dem Namen rsmv gespeichert ist:

#!/usr/bin/env bash

rsync -aP --remove-source-files "[email protected]" && rm -rf "${@:1:$#-1}"

Es verarbeitet mehr als eine Quelle und Dateinamen mit Leerzeichen:

$ rsmv source1 source2 source\ 3 "source 4" dest
0
mixel