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.

