Kopieren Sie Dateien unter Linux. Vermeiden Sie das Kopieren, wenn Dateien im Ziel vorhanden sind


32

Ich muss einen Ordner / home / user von einer Festplatte auf eine andere kopieren. Es hat 100.000 Dateien und eine Größe von ca. 10 GB.

ich benutze

cp -r /origin /destination

Manchmal erhalte ich einige Fehler, die auf kaputte Links, Berechtigungen usw. zurückzuführen sind. Also behebe ich den Fehler und muss den Kopiervorgang erneut starten.

Ich frage mich, wie ich dem Befehl "cp" mitteilen kann, wenn er versucht, erneut zu kopieren, Dateien nicht erneut zu kopieren, wenn sie im Zielordner vorhanden sind.


2
Nicht wir cp. Verwenden Sie stattdessen rsync.
William Pursell

Antworten:


22

cp -R -u -p /source /destination

Das -u( oder--update ) Flag macht genau das:

Von der Manpage für cp:

-u, --update

Kopieren Sie nur, wenn die SOURCE-Datei neuer als die Zieldatei ist oder wenn die Zieldatei fehlt


6
Um buchstäblich nur Dateien zu kopieren, die nicht existieren und bestehende nicht zu aktualisieren, yes n | cp -i /source/* /destination 2>/dev/null
sventechie

4
-u, - Nur kopieren, wenn die SOURCE-Datei neuer ist als die Zieldatei oder wenn die Zieldatei fehlt. -u, - Nur kopieren, wenn die SOURCE-Datei neuer ist als die Zieldatei oder wenn die Zieldatei fehlt -p wie --preserve = mode, owner, timestamps --preserve [= ATTR_LIST] behält die angegebenen Attribute bei (Standard: mode, owner,
time‐

51

Verwenden Sie einfach cp -n <source> <dest>.

Aus der Manpage :

-n, --no-Clobber

Überschreibe KEINE vorhandene Datei (überschreibe eine vorherige Option -i)


7
Dies ist die einzig wahre Antwort auf die Frage.
Sebix

20

rsync -aq /src /dest

Abgesehen davon, dass nur neuere Dateien kopiert werden, werden auch nur die neueren Teile von Dateien kopiert, wenn sich die Datei geändert hat. Es ist für das Kopieren über Netzwerkverbindungen gedacht, bei denen Sie die Datenmenge minimieren möchten - es funktioniert jedoch auch hervorragend lokal.


Ich kann Ihrer Nachricht keine Formatierung hinzufügen, da es sich nur um zwei Zeichen handelt. Wie würden Sie es finden, dies zu bearbeiten und Zeichen um Ihren Befehl hinzuzufügen?
Culix

4

Suchen Sie nach der Option "-u" für den cpBefehl.


2
Stimmen Sie nicht zu, dass die Verwendung von -u eine gute Idee ist. -u kopiert nur, wenn die Quelle neuer ist oder das Ziel fehlt. Das Problem mit dem ursprünglichen Poster wurde durch das Unterbrechen der Dateikopie verursacht, aus welchem ​​Grund auch immer. OP hätte daher eine halbgeschriebene Datei, die beim erneuten Ausführen der Kopie nicht aktualisiert wurde. Diese Datei könnte für jemanden wichtig sein! rsync löst dieses Problem.
Hazymat

2

Alle obigen Antworten sind korrekt, aber wenn Sie dies rekursiv tun, dann

du solltest tun:

 cp -rn SOURCE_PATH DESTINATION_PATH

1

Sie sollten als root kopiert werden, um Berechtigungen / Eigentumsrechte zu erhalten

# cp -au

Schauen Sie sich auch rsync an


1

POSIX-Lösung

Andere Antworten verwenden -u oder -nOptionen von cp. Beides wird von POSIX nicht benötigt . noch ist rsyncvon noch einer anderen Antwort; noch wird yesin einem der Kommentare verwendet.

Trotzdem können wir yes nmit einer whileSchleife reproduzieren . Dies führt zu folgender POSIX-Lösung:

while true; do echo n; done | cp -Ri /origin /destination 2>/dev/null

0

Verwenden cp -rn <sourcedirname>/. <destdirname>

Mit der Option r wird die Kopie über die Verzeichnisse rekursiv.

Der Schalter n (lange Version no-clobber) stellt sicher, dass vorhandene Dateien niemals überschrieben werden.

Das ' /.' nach dem Sourcedirname stellt sicher, dass es nicht zu einem Unterverzeichnis unter dem Zielverzeichnis wird, anstatt dass der gesamte Inhalt des ersteren in das letztere kopiert wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.