Gibt es beim Verschieben großer Verzeichnisse mv
eine Möglichkeit, den Fortschritt (%) anzuzeigen? Der cp
Befehl auf gentoo hatte einen -g
Schalter, der den Fortschritt anzeigt .
Gibt es beim Verschieben großer Verzeichnisse mv
eine Möglichkeit, den Fortschritt (%) anzuzeigen? Der cp
Befehl auf gentoo hatte einen -g
Schalter, der den Fortschritt anzeigt .
Antworten:
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/backup
mv und verwenden es normal.
Außerdem kannst du alias mvg="/usr/local/mvg -g"
dann nur noch sagen mvg bigfile /mnt/backup
und direkt den Fortschrittsbalken bekommen.
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 -P
Schalter 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
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, damit es überall in der Nähe läuft.
bar
wickelt mv
noch nicht ein
rsync
dies nicht mv
vollständig ersetzt (das OP fragt nach), insbesondere wenn es um schnelle Kopien auf Copy-on-Write-Dateisystemen wie geht btrfs
.
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
progress
nach der Installation einfach getippt und es hat mir den Fortschritt für den mv
Befehl angezeigt, auf den ich gerade gewartet habe. Vielen Dank!
sudo
denselben Benutzer verwenden (denke ich) - Sie können auch verwenden watch
, um alle 2 Sekunden zu sagen, was passiert:watch progress -w
watch progress -w
kannst du auch einfachprogress -m
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 gzip
und 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 cp
Fall ist. Das Kopieren ist jedoch nicht pv
das 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 mv
stattdessen möchten , hängen Sie das Flag an --remove-source-files
. Fügen Sie dies hinzu, .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, keine Fortschrittsanzeige.
tar cf - source-dir | pv | tar xf - -C out-dir
gibt Ihnen den Durchsatz eines ganzen Verzeichnisses. Wenn Sie die Größe kennen und -s
an pv übergeben, können Sie auch Fortschritte erzielen.
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.
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, $src
dass Sie nicht mit einem Backslash enden, sonst erhalten Sie eine andere Bedeutung als die von GNU cp
.
Das rm -r
am Ende wird benötigt, weil --remove-source-files
erst 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 -P
Option 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.
Um zu vermeiden, dass Coreutil-Patches hinzugefügt werden, um den Fortschrittsbalken zu mv
und hinzuzufügen cp
, ist gcp
(Goffi's CoPier) eine neue Alternative: http://wiki.goffi.org/wiki/Gcp/en
Verwendung wie cp
bei Optionen -r
für die Rekursivität und -v
fü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/
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 -sm
auf die Dateien und df -m | grep copy_to_partition
. Wenn ich dann neugierig bin, wie lange es noch dauern wird, mache ich das noch df
einmal und sehe, wie viel von den Dateien kopiert wurde.
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
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
gcp
unterstützt das Verschieben von Dateien nicht, dh Quelldateien müssen nach erfolgreichem Kopieren manuell entfernt werden.
Dies gibt Ihnen keinen Fortschrittsbalken, aber drücken CTRL-T
Sie und Sie senden einen SIGINFO
an 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%
INFO: unknown signal; killall -l lists signals.
geklappt : Ich glaube, SIGINFO ist nur auf einigen BSDs verfügbar, nicht im Standard-POSIX.
Dient mv -v
zum Drucken einer Zeile pro verschobener Datei und pv -l
zum 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 mv
auf der gleichen Partition schnell sein sollte. mv
auf eine andere Partition wäre das gleiche wie cp source target
gefolgt 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
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.