cp ist einer der grundlegenden Befehle in Unix. Sie wissen bereits, dass es verwendet wird, um eine oder mehrere Dateien oder Verzeichnisse von der Quelle zum Ziel zu kopieren.
Obwohl dieses Tutorial für Anfänger gedacht ist, ist es auch für jeden hilfreich, verschiedene cp-Befehlsoptionen anhand einiger praktischer Beispiele schnell zu überprüfen.
Selbst wenn Sie ständig den cp-Befehl verwenden, könnten Ihnen wahrscheinlich eines oder mehrere der unten erläuterten Beispiele neu sein.
Die allgemeine Form des Kopierbefehls:
cp [option] source destination
1. Kopieren Sie eine Datei oder ein Verzeichnis von der Quelle zum Ziel
Um eine Datei zu kopieren, müssen Sie Quelle und Ziel an den Kopierbefehl übergeben. Das folgende Beispiel kopiert die Datei von project/readme.txt nach projectbackup/readme-new.txt
$ cp project/readme.txt projectbackup/readme-new.txt $ cd projectbackup/ $ ls readme-new.txt
Wenn Sie eine Datei von einem Ordner in einen anderen mit demselben Namen kopieren möchten, genügt der Name des Zielverzeichnisses, wie unten gezeigt.
$ cp project/readme.txt projectbackup/ $ cd projectbackup/ $ ls readme.txt
Ein Verzeichnis (und sein gesamter Inhalt) kann mit der rekursiven Option -r wie unten gezeigt von der Quelle zum Ziel kopiert werden:
$ ls project src/ bin/ doc/ lib/ test/ readme.txt LICENSE $ cp -r project/ backup/ $ ls backup src/ bin/ doc/ lib/ test/ readme.txt LICENSE
2. Kopieren Sie mehrere Dateien oder Verzeichnisse
Sie können mehr als eine Datei von der Quelle zum Ziel kopieren, wie unten gezeigt:
$ cd src/ $ cp global.c main.c parse.c /home/thegeekstuff/projectbackup/src/
Wenn die Quelldateien ein gemeinsames Muster haben, verwenden Sie Platzhalter wie unten gezeigt. In diesem Beispiel werden alle C-Erweiterungsdateien in das Verzeichnis /home/thegeekstuff/projectbackup/src/ kopiert.
$ cp *.c /home/thegeekstuff/projectbackup/src/
Kopieren Sie mehrere Verzeichnisse wie unten gezeigt.
$ cd project/ $ cp -r src/ bin/ /home/thegeekstuff/projectbackup/
3. Vor dem Kopieren in ein Ziel sichern
Falls die Zieldatei bereits mit demselben Namen vorhanden ist, können Sie mit cp die Zieldatei sichern, bevor Sie sie überschreiben.
In diesem Beispiel existiert die readme.txt sowohl im project/- als auch im projectbackup/-Verzeichnis, und während sie von project/ nach projectbackup/ kopiert wird, wird die vorhandene readme.txt wie unten gezeigt gesichert:
$ cd projectbackup $ ls -l readme.txt -rw-r--r-- 1 bala geek 1038 Jan 8 13:15 readme.txt $ cd ../project $ ls -l readme.txt -rw-r--r-- 1 bala geek 1020 Jan 8 12:25 readme.txt $ cp --backup readme.txt /home/thegeekstuff/projectbackup/
Die vorhandene Datei wurde nach readme.txt~ verschoben und die neue Datei als readme.txt kopiert, wie unten gezeigt.
$ cd /home/thegeekstuff/projectbackup/ $ ls -l -rw-r--r-- 1 bala geek 1020 Jan 8 13:36 readme.txt -rw-r--r-- 1 bala geek 1038 Jan 8 13:15 readme.txt~
Apropos Backup:Es ist wichtig, dass Sie verstehen, wie der Befehl rsync funktioniert, um Dateien effektiv zu sichern.
4. Links beim Kopieren beibehalten
Wenn Sie den Befehl cp ausführen und die Quelle eine Linkdatei ist, wird die eigentliche Datei kopiert und nicht die Linkdatei. Falls Sie den Link nur so kopieren möchten, wie er ist, geben Sie die Option -d wie unten gezeigt an:
Das Folgende zeigt, dass ohne die Option -d die Datei (und nicht der Link) kopiert wird:
$ cd project/bin $ ls -l startup.sh lrwxrwxrwx 1 root root 18 Jan 8 13:59 startup.sh -> ../test/startup.sh $ cp startup.sh /home/thegeekstuff/projectbackup/bin/ $ cd /home/thegeekstuff/projectbackup/bin/ $ ls -l -rw-r--r-- 1 root root 102 Jan 8 14:02 startup.sh
Gehen Sie wie folgt vor, um den Link beim Kopieren beizubehalten:
$ cd project/bin $ cp -d startup.sh /home/thegeekstuff/projectbackup/bin/ $ ls -l startup.sh lrwxrwxrwx 1 root root 18 Jan 8 14:10 startup.sh -> ../test/startup.sh
5. Überschreiben Sie keine vorhandene Datei
Wenn Sie nur kopieren möchten, wenn die Zieldatei nicht existiert, verwenden Sie die Option -n wie unten gezeigt. Dadurch wird die vorhandene Datei nicht überschrieben, und der cp-Befehl kehrt mit dem Erfolgs-Exit-Code zurück, wie unten gezeigt:
$ cd projectbackup $ ls -l readme.txt -rw-r--r-- 1 bala geek 1038 Jan 8 13:15 readme.txt $ cd ../project $ ls -l readme.txt -rw-r--r-- 1 bala geek 1020 Jan 8 12:25 readme.txt $ cp -n readme.txt /home/thegeekstuff/projectbackup/bin/ $ echo $? 0
Wie Sie unten sehen, wurde die Zieldatei nicht überschrieben.
$ cd projectbackup $ ls -l readme.txt -rw-r--r-- 1 bala geek 1038 Jan 8 13:15 readme.txt
6. Vor dem Überschreiben bestätigen (interaktiver Modus)
Wenn Sie die Option -i verwenden, werden Sie um eine Bestätigung gebeten, bevor eine Datei wie unten gezeigt überschrieben wird.
$ cp -i readme.txt /home/thegeekstuff/projectbackup/ cp: overwrite `/home/thegeekstuff/projectbackup/readme.txt'? y
7. Hardlink zu einer Datei erstellen (anstatt zu kopieren)
Wenn Sie den Befehl cp ausführen, ist es möglich, einen festen Link der Datei zu erstellen (anstatt die Datei zu kopieren). Das folgende Beispiel erstellt den festen Link für die Datei sample.txt im Verzeichnis test/,
$ ls -li sample.txt 10883362 -rw-r--r-- 2 bala geek 1038 Jan 9 18:40 sample.txt $ cp -l sample.txt test/ $ ls -li test/sample.txt 10883362 -rw-r--r-- 2 bala geek 1038 Jan 9 18:40 test/sample.txt
Wie oben zu sehen ist, ist die Datei test/sample.txt eine fest mit der Datei sample.txt verknüpfte Datei, und die Inodes beider Dateien sind gleich.
8. Erstellen Sie einen Softlink zu einer Datei oder einem Verzeichnis (anstatt zu kopieren)
Wenn Sie den cp-Befehl ausführen, ist es möglich, einen Softlink zu einer Datei oder einem Verzeichnis zu erstellen. Im folgenden Beispiel wird ein symbolischer Link für libFS.so.6.0.0 als libFS.so,
erstellt# cd /usr/lib/ # ls -l libFS.so.6.0.0 -rw-r--r-- 1 root root 42808 Nov 19 2010 libFS.so.6.0.0 # cp -s libFS.so.6.0.0 libFS.so # ls -l libFS.so lrwxrwxrwx 1 root root 14 Jan 9 20:18 libFS.so -> libFS.so.6.0.0
9. Datei- oder Verzeichnisattribute beim Kopieren beibehalten
Mit der Option -p können Sie die Eigenschaften einer Datei oder eines Verzeichnisses wie unten gezeigt beibehalten:
$ ls -l sample.txt -rw-r--r-- 2 bala geek 1038 Jan 9 18:40 sample.txt $ cp -p sample.txt test/ $ ls -l test/sample.txt -rw-r--r-- 2 bala geek 1038 Jan 9 18:40 test/sample.txt
Es ist auch möglich, nur die erforderlichen Eigenschaften wie Modus, Besitz, Zeitstempel usw. beizubehalten,
Das folgende Beispiel behält den Modus einer Datei beim Kopieren bei:
$ cp --preserve=mode sample.txt test/
10. Nur kopieren, wenn die Quelldatei neuer als die Zieldatei ist oder fehlt
Das Kopieren einer kleinen Datei nimmt nicht viel Zeit in Anspruch, aber es kann viel Zeit in Anspruch nehmen, wenn eine große Datei kopiert wird. Wenn Sie also eine große Datei kopieren, sollten Sie sicherstellen, dass Sie dies nur tun, wenn die Quelldatei neuer als die Zieldatei ist oder wenn die Zieldatei fehlt, indem Sie die Option -u wie unten gezeigt verwenden.
In diesem Beispiel werden die beiden Dateien LICENSE und readme.txt von project/ nach projectbackup/ kopiert. Die LICENSE-Datei existiert jedoch bereits im projectbackup/-Verzeichnis und ist neuer als die im project/-Verzeichnis.
$ cd project/ $ ls -l LICENSE readme.txt -rw-r--r-- 1 bala geek 108 Jan 8 13:14 LICENSE -rw-r--r-- 1 bala geek 32 Jan 8 13:16 readme.txt $ cd /home/thegeekstuff/projectbackup/ $ 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
In diesem Beispiel ist es also nicht erforderlich, die LICENSE-Datei erneut in das Verzeichnis projectbackup/ zu kopieren. Dies wird automatisch vom Befehl cp erledigt, wenn Sie die Option -u wie unten gezeigt verwenden. Im folgenden Beispiel wurde nur die readme.txt-Datei kopiert, wie durch den Zeitstempel auf der Datei angegeben.
$ cp -u -v LICENSE readme.txt /home/thegeekstuff/projectbackup/ `readme.txt' -> `/home/thegeekstuff/projectbackup/readme.txt' $ cd /home/thegeekstuff/projectbackup/ $ ls -l LICENSE readme.txt -rw-r--r-- 1 bala geek 112 Jan 9 20:31 LICENSE -rw-r--r-- 1 bala geek 32 Jan 9 22:17 readme.txt