it-swarm.com.de

Linux, wie man kopiert, aber nicht überschreibt?

Ich möchte ein Verzeichnis cp, aber ich möchte keine vorhandenen Dateien überschreiben, auch wenn sie älter als die kopierten Dateien sind. Und ich möchte es ganz und gar nicht interaktiv machen, da dies Teil eines Crontab Bash-Skripts sein wird. Irgendwelche Ideen?

326
mnowotka

Entnommen aus der Manpage :

-n, --no-clobber
              do not overwrite an existing file (overrides a previous -i option)

Beispiel:

cp -n myoldfile.txt mycopiedfile.txt
501
hovanessyan

Erwägen Sie die Verwendung von rsync .

rsync -a -v --ignore-existing src dst

Gemäß den Kommentaren ist rsync -a -v src dst nicht korrekt, da vorhandene Dateien aktualisiert werden.

75
Hans Ginzel
cp -n

Ist was du willst. Siehe die Manpage.

48
bucko

Für Leute, die feststellen, dass sie keine 'n'-Option haben (wie ich bei RedHat), können Sie cp -u verwenden, um die Datei nur zu schreiben, wenn die Quelle neuer als die vorhandene ist (oder keine vorhanden ist) einer).

[edit] Wie in den Kommentaren erwähnt, werden ältere Dateien überschrieben, also nicht genau das, was das OP wollte. Verwenden Sie dazu die Antwort von ceving.

32
Grim...

Dies wird auf RedHat funktionieren:

false | cp -i source destination 2>/dev/null

Aktualisierung und nicht überschreiben ist etwas anderes.

30
ceving

Alpine Linux: Die folgende Antwort gilt nur für den Fall einer einzelnen Datei: In Alpine funktioniert cp -n nicht (und false | cp -i ... auch). In meinem Fall funktioniert die Lösung folgendermaßen:

if [ ! -f env.js ]; then cp env.example.js env.js; fi 

Wenn im obigen Beispiel die Datei env.js nicht vorhanden ist, kopieren wir env.example.js nach env.js.

8

Einige Versionen von cp haben nicht die Option - no-clobber. In diesem Fall:

  echo n | cp -vipr src/* dst
0
Octavian