wake-up-neo.net

Wie kann ich beim Kopieren eines Verzeichnisses mit cp eine Fortschrittsleiste erstellen?

Ich nehme an, ich könnte die Anzahl der Dateien im Quellverzeichnis mit der Anzahl der Dateien im Zielverzeichnis vergleichen, wenn cp fortschreitet, oder vielleicht mit der Ordnergröße. Ich habe versucht, Beispiele zu finden, aber alle Bash-Fortschrittsbalken scheinen für das Kopieren einzelner Dateien geschrieben zu sein. Ich möchte eine Reihe von Dateien kopieren (oder ein Verzeichnis, falls das erstere nicht möglich ist).

43
octosquidopus

Sie können auch rsync anstelle von cp folgendermaßen verwenden:

rsync -Pa source destination

Dadurch erhalten Sie einen Fortschrittsbalken und eine voraussichtliche Fertigstellungszeit. Sehr praktisch.

53
SteveLambert

Um eine Fortschrittsleiste anzuzeigen, während Sie eine rekursive Kopie von Dateien, Ordnern und Unterordnern (einschließlich Verknüpfungen und Dateiattributen) erstellen, können Sie gcp verwenden.

gcp -rf SRC DEST

Hier ist die typische Ausgabe beim Kopieren eines großen Ordner mit Dateien:

Copying 1.33 GiB  73% |#####################      | 230.19 M/s ETA:  00:00:07

Beachten Sie, dass nur eine Fortschrittsleiste für den gesamten Vorgang angezeigt wird. Wenn Sie jedoch eine einzelne Fortschrittsleiste pro Datei wünschen, können Sie rsync verwenden:

rsync -ah --progress SRC DEST
22
Shervin Emami

Sie können sich das Tool vcp ansehen. Das ist ein einfaches Kopierwerkzeug mit zwei Fortschrittsbalken: Einer für die aktuelle Datei und einer für die Gesamtdatei. 

EDIT

Hier ist der Link zu den Quellen: http://members.iinet.net.au/~lynx/vcp/ Die Manpage ist hier zu finden: http://linux.die.net/ man/1/vcp

Die meisten Distributionen haben ein Paket dafür.

7
Thomas Berger

Hier eine andere Lösung: Verwenden Sie das Tool bar

Sie könnten es so aufrufen:

#!/bin/bash
filesize=$(du -sb ${1} | awk '{ print $1 }')
tar -cf - -C ${1} ./ | bar --size ${filesize} | tar -xf - -C ${2}

Sie müssen den Weg über tar gehen, und bei kleinen Dateien ist dies ungenau. Sie müssen auch darauf achten, dass das Zielverzeichnis vorhanden ist. Aber es ist ein Weg.

4
Thomas Berger

Ein einfacher Unix Weg ist, zum Zielverzeichnis zu gehen und watch -n 5 du -s zu tun. Machen Sie es vielleicht schöner, indem Sie es als Bar zeigen. Dies kann in Umgebungen hilfreich sein, in denen Sie nur über die standardmäßigen Unix-Dienstprogramme verfügen und keine zusätzlichen Dateien installieren müssen. du-sh ist der Schlüssel, die Uhr muss nur alle 5 Sekunden ausgeführt werden. Vorteile : Funktioniert auf jedem Unix-System Nachteile : Keine Fortschrittsanzeige 

2
Nishant

Meine bevorzugte Option ist Advanced Copy , da sie die ursprünglichen cp-Quelldateien verwendet.

$ wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz
$ tar xvJf coreutils-8.21.tar.xz
$ cd coreutils-8.21/
$ wget --no-check-certificate https://raw.githubusercontent.com/atdt/advcpmv/master/advcpmv-0.5-8.21.patch
$ patch -p1 -i advcpmv-0.5-8.21.patch
$ ./configure
$ make

Die neuen Programme befinden sich jetzt in src/cp und src/mv. Sie können Ihre vorhandenen Befehle ersetzen:

$ Sudo cp src/cp /usr/local/bin/cp
$ Sudo cp src/mv /usr/local/bin/mv
1
elboletaire

Es gibt ein Werkzeug pv, das genau dies tut: http://www.ivarch.com/programs/pv.shtml

Es gibt eine Ubuntu-Version in apt

1
Foo Bah

Wie wäre es mit so etwas

find . -type f | pv -s $(find . -type f | wc -c) | xargs -i cp {} --parents /DEST/$(dirname {})

Er findet alle Dateien im aktuellen Verzeichnis, leitet diese durch PV und gibt PV eine geschätzte Größe, damit die Fortschrittsanzeige funktioniert, und leitet sie dann an einen CP-Befehl mit dem Flag --parents weiter, damit der Pfad DEST mit dem SRC-Pfad übereinstimmt.

Ein Problem, das ich noch überwinden muss, ist das, wenn Sie diesen Befehl ausgeben

find /home/user/test -type f | pv -s $(find . -type f | wc -c) | xargs -i cp {} --parents /www/test/$(dirname {})

der Zielpfad wird zu/www/test/home/user/test/.... FILES ... und ich bin nicht sicher, wie ich den Befehl anweisen soll, den Teil '/ home/user/test' zu löschen. Deshalb muss ich es aus dem SRC-Verzeichnis heraus ausführen.

0
Ken Brill

Um eine weitere Option hinzuzufügen, können Sie cpv verwenden. Es verwendet pv, um die Verwendung von cp nachzuahmen. 

Es funktioniert wie pv, aber Sie können Verzeichnisse rekursiv kopieren

 enter image description here

Sie können es bekommen hier

0
nachoparker

Überprüfen Sie den Quellcode für progress_bar im unteren git-Repository von mir

https://github.com/Kiran-Bose/supreme

Probieren Sie auch das benutzerdefinierte Bash-Skriptpaket supreme aus, um zu überprüfen, wie die Statusleiste mit den Befehlen cp und mv funktioniert

Funktionsübersicht

(1) Öffnen Sie Apps ---- Firefox ---- Rechner ---- Einstellungen

(2) Dateien verwalten ---- Suche ---- Navigieren ---- Schnellzugriff

            |----Select File(s)
            |----Inverse Selection
            |----Make directory
            |----Make file
                                          |----Open
                                          |----Copy
                                          |----Move
                                          |----Delete
                                          |----Rename
                                          |----Send to Device
                                          |----Properties

(3) Telefon verwalten ---- Vom Telefon verschieben/kopieren ---- Zum Telefon verschieben/kopieren ---- Ordner synchronisieren

(4) USB verwalten ---- Verschieben/Kopieren von USB ---- Verschieben/Kopieren auf USB

0
KIRAN B