Fortschrittsinformationen per pv für Verzeichniskopie


13

Ich muss ein sehr großes Verzeichnis kopieren (hier in Terabyte) und möchte den Fortschritt überwachen.

Ich fand das pvein nettes Dienstprogramm, aber wie kann ich es zum rekursiven Kopieren von Verzeichnissen verwenden? ( pv src > dstfunktioniert nicht, weil es sich um Verzeichnisse handelt)

PS: Läuft auf OS X Mountain Lion, pvwurde von Mac-Ports installiert

Antworten:


21

Verwenden rsync --progress [SRC] [DST]

Überprüfen Sie die man rsyncSeite, da sie viele sehr nützliche Optionen enthält. -afor archive ist ein guter Anfang, aber es hängt von Ihren genauen Anforderungen ab.

Durch Kopieren über eine Pipe wird der Kopiervorgang unnötig verlangsamt, insbesondere wenn er dateibasiert ist.


Warum würde das Kopieren durch eine Pipe den Prozess verlangsamen? Die Pufferung durch Pipes und das mit Pipes verbundene Multitasking werden wahrscheinlich helfen, würde ich sagen. (und Rsync ist Multi-Prozesse und verwendet intern IIRC-Pipes). Was ist ein Kopiervorgang, der nicht dateibasiert ist?
Stéphane Chazelas

Bash ist praktisch, aber nicht schnell. Vor allem, wenn ein Befehl an den anderen weitergeleitet wird.
jippie

@StephaneChazelas: Da der Puffer einer Pipe nur 8 KB groß ist. Ein Programm wie rsync möchte möglicherweise einen viel größeren internen Puffer verwenden.
Zan Lynx

10

Sie könnten taroder paxoder verwenden cpio:

mkdir -p dst &&
  (cd src && tar cf - .) | pv -trb | (cd dst && tar xpf -)

1
Darüber hinaus können Sie vdem tarBefehl ein hinzufügen , um die Dateinamen anzuzeigen.
Peterph

Also wird der Quellordner vor dem Kopieren komprimiert, oder? Mein Ordner hat eine Größe von 5 TB, ich bin mir also nicht sicher, ob dies der beste Weg ist? Ich benutze pv sehr gerne, da es einen wirklich guten Fortschrittsstatus aufweist. Irgendwelche Tipps bitte?
Tak

@Tak, nein, es wird nichts komprimiert, da es keine Komprimierung gibt. tar cf -gibt einen Stream mit den Dateien und ihren Metadaten aus, der über eine Pipe an pv weitergeleitet wird und den anderen tarbeim Drucken einer Fortschrittsanzeige unberührt lässt. Der andere tarStream extrahiert die Daten in diesem Stream. Alle drei Befehle werden gleichzeitig ausgeführt und verarbeiten Daten, es wird nichts auf der Festplatte gespeichert, es wird nichts im Speicher gespeichert, außer den Pipe-Puffern und den internen Puffern der Befehle, die nur ein paar Kilobyte betragen.
Stéphane Chazelas

@ StéphaneChazelas Danke für den Kommentar. Ich habe es ausprobiert und es funktioniert. Das Einzige ist, dass der Fortschrittsbalken nicht den erwarteten Prozentsatz anzeigt, den er von links nach rechts beibehält. Irgendeine Idee warum? Ich habe pv mit diesem Parameter -petra verwendet, der normalerweise den Fortschrittsbalken anzeigt, in dem der Balken bis zum Ende gefüllt bleibt. Ich habe auch Ihre Antwort positiv bewertet.
Tak

@Tak, pvkann nicht wissen, wie viele Daten zu übertragen sind. Wenn Sie einen Schätzwert für diesen Betrag haben, können Sie ihn mit der -sOption weitergeben (GNU du -sb srcwürde Ihnen einen guten
Stéphane Chazelas

2

Teer.

tar -cf - /var/log/ | pv | tar -C . -x

Beispiel:

# tar -cf - /var/log/ | pv | tar -C . -x
tar: Removing leading `/' from member names
58MB 0:00:05 [ 2.2MB/s] [                   <=> 

1

Hier sind einige Befehle zum Kopieren von Verzeichnissen mit Fortschrittsinformationen.


Wenn es viele kleine Dateien gibt:

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

Dadurch wird der Fortschritt basierend auf der Anzahl der kopierten Dateien gemeldet.

Sie können weiterleiten, /dev/nullwenn Sie nicht brauchen logfile.

Verwenden Sie den folgenden Befehl, um Folgendes abzurufen filecount:

find sourcedir | wc -l

Wenn es nur wenige große Dateien gibt:

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

Dies zeigt den Fortschritt basierend auf den kopierten Bytes an.

targetdir muss existieren.

Verwenden Sie den folgenden Befehl, um Folgendes abzurufen size:

du -sh sourcedir

Wenn Sie rsync verwenden möchten:

rsync -ai sourcedir/ targetdir/ | pv -l -s filecount > logfile

Holen Sie sich filecountwie oben gezeigt.

Wenn Sie auf demselben System kopieren, rsync -aist dies praktisch dasselbe wie cp -a. Die Vorteile von rsync liegen darin, dass Sie über das Netzwerk kopieren oder eine vorherige Kopie aktualisieren (oder vergleichen).

Weitere Details finden Sie hier:


0

Sie können einen du -b /directory/Befehl sowohl für die Quelle als auch für das Ziel ausführen, während ein normaler Kopierbefehl ausgeführt wird, und die beiden vergleichen. Dies ist genauso effektiv und verlangsamt den Kopiervorgang nicht, indem er durch eine Pipe gedrückt wird.


-1
find source-dir -print0 | xargs -0 -I % pv % > dest-dir/%

3
Bitte erkläre die Lösung der Tour, du willst OP in der Lage sein, sie zu prüfen (und zu lernen)
vonbrand
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.