Konsolentipps | David Wolski | 2-2021 | 29. Januar 2021

Patch: Kopieren und Verschieben mit Fortschrittsbalken

Das ist der Fortschritt! Ein Patch rüstet einen Fortschrittsbalken für die Befehle „cp“ und „mv“ nach. Die Dateioperationen werden dadurch geringfügig langsamer.

Der Befehl „cp“ kopiert Dateien und Verzeichnisse von A nach B und „mv“ verschiebt diese. Während der Aktion verrichten diese Befehl in der Shell ihre Arbeit ohne jede Information über den Fortschritt. Im Falle großer Datenmengen und länger dauernden Aktionen wäre eine Fortschrittsanzeige nützlich.

Die Befehle „cp“ und „mv“ werden unter Linux vom Paket „coreutils“ bereitgestellt, dessen Pflege beim GNU Projekt liegt. Deren Entwickler werden keine Fortschrittsanzeige mehr in „cp“ und „mv“ einbauen, weil diese Tools als abgeschlossen gelten. Stattdessen wird in immer wieder aufkeimenden Diskussionen gerne auf Programme wie progress und das Netzwerk-Kopierwerkzeug rsync verwiesen, die einen Fortschrittsbalken haben.

Aus Anwendersicht sind diese Antworten wenig befriedigend und ein Patch von https://git
hub.com/jarun/advcpmv
für die Coreutils 8.32 schafft mit vertretbarem Aufwand Abhilfe, zumindest in Debian/Ubuntu und Raspberry-Pi-OS. Ein Nachrüsten der Fortschrittsanzeige in „cp“ und „mv“ erfordert die Anwendung eines vorbereiteten Patchs auf den Quellcode und dann dessen Kompilierung.

1. Vorbereitung: Ein Debian- und Ubuntu-System verlangt üblicherweise noch die Programme zum Kompilieren von Quellcode, die der Einfachheit halber im Metapaket „build-essential“ zusammengefasst sind. 

Das Kommando

sudo apt-get install build-essential patch wget

installiert alles Notwendige für die anstehende Aufgabe.

2. Quellcode beziehen: Die aktuellsten Coreutils liegen in Version 8.32 vor (Stand Januar 2021), die der Befehl

wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.32.tar.xz

im Quellcode für alle CPU-Architekturen in das aktuelle Verzeichnis herunterlädt. Anschließend entpackt

tar xvJf coreutils-8.32.tar.xz

das Quellcode-Archiv in ein neues Unterverzeichnis und mit

cd coreutils-8.32

wechseln Sie in das neue Verzeichnis.

3. Patch anwenden: Den Patch von Github für Coreutils 8.32 holt jetzt der Befehl

wget -O advcpmv https://git.io/JL5R2

anhand einer von uns erstellten Kurz-URL als Datei „advcpmv“ in das Quellcode-Verzeichnis und die Eingabe von

patch -p1 -i advcpmv

wendet den Patch auf die Coreutils 8.32 an. Diese müssen jetzt noch neu kompiliert werden.

4. Coreutils kompilieren: Weiterhin im Quellcode-Verzeichnis starten die beiden Kommandos

./configure

make

den Kompilierungsprozess von GCC. Dieser wird ein paar Warnungen anzeigen, die man ignorieren kann.

5. Alternative Binarys installieren: Nun liegen die neuen Tools „cp“ und „mv“ im Unterordner „src“ vor. Es wäre jetzt allerdings ein Fehler, die Binarys einfach mit vorangestelltem „sudo“ über die vorhandenen Befehle „cp“ und „mv“ zu kopieren. Denn ein späteres Paketupdate würde diese Dateien dann wieder überschreiben. 

Stattdessen legt man nun zu den Kopien dieser Dateien jeweils einen Alias in der Shell an. Das gelingt mit diesen Kommandos:

sudo cp ./src/cp /usr/local/bin/advcp

sudo cp ./src/mv /usr/local/bin/advmv

echo alias cp="'/usr/local/bin/advcp -g'" >> ~/.bash_aliases

echo alias mv="'/usr/local/bin/advmv -g'">> ~/.bash_aliases

Achten Sie bei den letzten beiden Befehlen auf die doppelten und einfachen Anführungszeichen. Ab der nächsten Anmeldung führt ein „cp“ oder „mv“ die neuen Binarys mit Fortschrittsanzeige aus.