Linux und Unix: Dateien kopieren mit CP-Befehl

Das Arbeiten mit Kommandozeilen-Tools wird in modernen Betriebssystemen immer seltener benötigt und trotzdem sind die Befehle für einige Projekte unter Linux und Unix unabdingbar. Für die Arbeit mit dem Raspberry Pi ist es einfacher die entsprechenden Befehle für den Terminal zu kennen als über die grafische Benutzeroberfläche zu arbeiten. Dieses Tutorial stellt den cp-Befehl zum kopieren von Dateien vor.

Die meisten die regelmäßig mit Linux oder Unix Systemen arbeiten, werden den cp-Befehl bereits kennen und wissen, dass sich mit cp eine oder mehrere Dateien oder Ordner vom Quellorder zum Zielordner kopieren lässt. Diese Anleitung ist für Beginner, hilft aber auch Fortgeschrittenen die unterschiedlichen Befehle und Optionen unter Linux und Unix zu verstehen.

Dateien in Linux und Unix mit CP-Befehl kopieren
Dateien in Linux und Unix mit CP-Befehl kopieren (Bild: Ubuntu.com).

Linux und Unix: Dateien kopieren mit CP-Befehl

Selbst wenn ihr den cp-Befehl jeden Tag verwendet, werdet ihr vermutlich das ein oder andere Beispiel in diesem Tutorial noch nicht kennen. Der generelle c-Befehl lautet wie folgt:

cp [option] quelle ziel

Die gezeigten Beispiele zum Kopieren gelten sowohl für Linux als auch Unix Betriebssysteme.

1. Datei oder Ordner von einer Quelle zum Ziel kopieren

Um eine Datei zu kopieren, müssen Quelle und Ziel dem Befehl bekannt sein. Das folgende Beispiel kopiert eine Datei von Projekt/liesmich.txt to BackupProjekt/liesmich-neu.txt

$ cp Projekt/liesmich.txt BackupProjekt/liesmich-neu.txt

$ cd BackupProjekt

$ ls
liesmich-neu.txt

Soll eine Datei von einem Ordner in einen anderen Ordner kopiert werden und der Name der Datei bleibt gleich, genügt der Name des Zielordners.

$ cp Projekt/liesmich.txt BackupProjekt/liesmich-neu.txt

$ cd BackupProjekt

ls
liesmich-neu.txt

Ein Ordner inklusive dessen Inhalt lässt sich von der Quelle zum Ziel mit der recursive-Option -r kopieren.

$ ls Projekt
src/ bin/ doc/ lib/ test/liesmich.txt

$ cp -r Projekt/ Sicherung/

$ ls Sicherung
src/ bin/ doc/ lib/ test/liesmich.txt

2. Mehrere Dateien oder Ordner kopieren

Es lassen sich mehr als nur eine Datei von der Quelle zum Ziel kopieren:

$ cd src/
$ cp datei1.c datei2.c datei3.c /home/user/BackupProjekt/src/

Sollten die Quell-Dateien ein gemeinsames Muster haben, können Wild-Cards verwendet werden. Im Beispiel unten werden alle Dateien mit c Erweiterung in das Zielverzeichnis /home/user/BackupProjekt/src/ kopiert.

$ cp *.c/home/user/BackupProjekt/src/

Mehrere Ordner lassen sich wie folgt kopieren:

$ cd Projekt/

$ cp -r src/ bin/ /home/user/BackupProjekt/src/

3. Backup vor dem Kopieren erstellen

Für Anwendungsfälle in denen die Zieldatei den selben Namen wie die Quelldatei hat, kann von der Zieldatei vor dem Kopieren ein Backup erstellt werden, bevor diese überschrieben wird.

In diesem Beispiel existiert die Datei liesmich.txt im Quellordner Projekt/ als auch im Zielordner BackupProjekt/. Während des Kopiervorgangs wird die existierend liesmich.txt im Zielordner als Backup gesichert.

$ cd BackupProjekt

$ ls -l liesmich.txt
-rw-r--r-- 1 bala user 1038 Jan 8 13:15 liesmich.txt

$ cd ../Projekt

$ ls -l liesmich.txt
-rw-r--r-- 1 bala user 1020 Jan 8 12:25 liesmich.txt

$ cp --backup liesmich.txt /home/user/BackupProjekt/

Die existierende Datei wurde in liesmich.txt~ umbenannt und die neue Datei als liesmich.txt kopiert.

$ cd /home/user/BackupProjekt/
$ ls -l
-rw-r--r-- 1 bala user 1020 Jun 21 14:36 liesmich.txt
-rw-r--r-- 1 bala user 1038 Jun 21 14:15 liesmich.txt~

4. Link beim Kopieren erhalten

Ist die Quelldatei eine verlinkte Datei, wird beim Ausführen des cp-Befehls nicht die Verknüpfung sondern die eigentliche Datei kopiert. Soll jedoch nur die Verknüpfung kopiert werden, wird die zusätzliche Option -d benötigt:

Wird cp ohne die Option -d ausgeführt, wird die Datei und nicht der Link kopiert::

$ cd Projekt/bin

$ ls -l test.sh
lrwxrwxrwx 1 root root 18 Jun 21 13:59 startup.sh -> ../test/test.sh

$ cp startup.sh /home/usber/BackupProjekt/bin/

$ cd /home/user/BackupProjekt/bin/

$ ls -l
-rw-r--r-- 1 root root 102 Jun 21 14:02 test.sh

Damit der Link beim Kopieren erhalten bleibt, ist wie folgt vorzugehen:

$ cd Projekt/bin

$ cp -d test.sh /home/user/BackupProjekt/bin/

$ ls -l startup.sh
lrwxrwxrwx 1 root root 18 Jun 21 14:10 test.sh -> ../test/test.sh

5. Existierende Datei nicht überschreiben

Soll eine Datei nur kopiert werden, wenn diese im Quellordner nicht existiert, wird die Option -n benötigt. Diese verhindert, dass eine bestehende Datei überschrieben wird. Zudem zeigt der cp-Befehl eine Erfolgsmeldung.

$ cd BackupProjekt

$ ls -l liesmich.txt
-rw-r--r-- 1 bala user 1038 Jun 21 15:15 liesmich.txt

$ cd ../Projekt

$ ls -l liesmich.txt
-rw-r--r-- 1 bala user 1020 Jun 21 15:17 readme.txt

$ cp -n liesmich.txt /home/user/BackupProjekt/bin/

$ echo $?
0

Wie unten dargestellt, wird die Datei nicht überschrieben:

$ cd BackupProjekt

$ ls -l liesmich.txt
-rw-r--r-- 1 bala user 1038 Jun 21 15:15 liesmich.txt

6. Bestätigung vor dem Überschreiben

Die -i Option muss der Benutzer vor dem Überschreiben diese Aktion bestätigen.

$ cp -i readme.txt /home/thegeekstuff/projectbackup/
cp: overwrite `/home/thegeekstuff/projectbackup/readme.txt'? y

7. Hard-Link zur Datei erstellen (anstatt diese zu kopieren)

Anstelle einer Kopie kann der cp-Befehl auch einen Link zur Quelldatei erstellen. Das folgende Beispiel erstellt einen Link zur beispiel.txt im Ordner test/.

$ ls -li beispiel.txt
10883362 -rw-r--r-- 2 bala user 1038 Jun 21 15:40 beispiel.txt

$ cp -l beispiel.txt test/

$ ls -li test/beispiel.txt
10883362 -rw-r--r-- 2 bala user 1038 Jun 9 15:40 test/beispiel.txt

Wie oben dargestellt, von der test/beispiel.txt besteht ein Hard-Link zur beispiel.txt und die inode ist bei beiden Dateien die gleiche.

8. Soft-Link zu einer Datei oder einem Verzeichnis (anstatt diese zu kopieren)

Beim Ausführen des cp-Befehls lassen sich auch Soft-Links zu Dateien oder Verzeichnissen erstellen. Das folgende Beispiel erstellt einen symbolischen Link für datei.xyz.1.12 also datei.xyz

# cd /usr/lib/

# ls -l datei.xyz.1.12
-rw-r--r-- 1 root root 42808 Jun 21 2016 datei.xyz.1.12

# cp -s datei.xyz.1.12 datei.xyz

# ls -l datei.xyz
lrwxrwxrwx 1 root root 14 Jun 21 17:18 datei.xyz -> datei.xyz.1.12

9. Attribute von Dateien oder Verzeichnis beibehalten

Die -p Option erhält beim Kopieren die Attribute von Dateien und Verzeichnissen:

$ ls -l beispiel.txt
-rw-r--r-- 2 bala user 1038 Jun 21 16:40 beispiel.txt

$ cp -p beispiel.txt test/

$ ls -l test/beispiel.txt
-rw-r--r-- 2 bala user 1038 Jun 21 16:40 test/beispiel.txt

Zusätzlich lassen sich auch nur die benötigten Attribute wie mode, ownership, timestamps, usw. erhalten. Folgendes Beispiel erhält den mode beim Kopieren:

$ cp --preserve=mode beispiel.txt test/

10. Kopiervorgang nur durchführen, wenn Quelldatei neuer als Zieldatei oder Zieldatei nicht vorhanden

Das Kopieren von kleinen Dateien dauert in der Regel nicht lange. Von großen Dateien oder viele Dateien kann der Kopiervorgang viel Zeit in Anspruch nehmen. Deshalb empfiehlt es sich beispielsweise nur die Dateien zu kopieren die in der Quelle neuer und am Ziel beispielsweise nicht vorhanden sind. Das erfolgt mit der -u Option:

In diesem Beispiel werden die beiden Dateien TEST und liesmich.txt vom Quellordner Projekt/ in den Zielordner BackupProjekt/ kopiert. Die Datei TEST besteht im Zielordner allerdings schon und ist neuer als die Datei im Quellordner.

$ cd Projekt/

$ ls -l TEST liesmich.txt
-rw-r--r-- 1 bala user 108 Jun 21 18:13 TEST
-rw-r--r-- 1 bala user 32 Jun 21 18:15 liesmich.txt

$ cd /home/user/BackupProjekt/

$ ls -l LICENSE readme.txt
ls: cannot access readme.txt: No such file or directory
-rw-r--r-- 1 root root 112 Jan 9 20:31 LICENSE

Im Beispiel gibt es keinen Grund die Datei TEST erneut in das Verzeichnis BackupProjekt/ zu kopieren. Der cp-Befehl überprüft das Vorhandensein wenn die Option -u verwendet wird. Im Beispiel unten wird nur die liesmich.txt kopiert.

$ cp -u -v TEST readme.txt /home/user/BackupProjekt/
`liesmich.txt' -> `/home/user/BackupProjekt/liesmich.txt'

$ cd /home/user/BackupProjekt/

$ ls -l TESTliesmich.txt
-rw-r--r-- 1 bala user 112 Jun21 20:31 TEST
-rw-r--r-- 1 bala user 32 Jun21 22:17 liesmich.txt

Persönliche Meinung

Der cp-Befehl ermöglicht weit mehr Spielraum und Optionen als das einfache Copy & Past mit Maus und Tastatur. Die Befehle sind nicht zwingend selbsterklärend, Nutzer die unter Linux oder Unix viel und oft Dateien kopieren, werden mit den zusätzlichen Optionen zum cp-Befehl deutlich besser unterwegs sein.

Ein Gedanke zu „Linux und Unix: Dateien kopieren mit CP-Befehl

Kommentar verfassen