Ich möchte cp
ein Verzeichnis erstellen, aber ich möchte keine vorhandenen Dateien überschreiben, auch wenn diese älter als die kopierten Dateien sind. Und ich möchte es völlig nicht interaktiv machen, da dies Teil eines Crontab Bash-Skripts sein wird. Irgendwelche Ideen?
385
Antworten:
Entnommen aus der Manpage :
Beispiel:
quelle
cp -n source.txt destination.txt || true
cp -n
wird nicht mit Fehler beendet, wenn die Datei unter Ubuntu 12.04 vorhanden ist.Erwägen Sie die Verwendung
rsync
.Laut Kommentar
rsync -a -v src dst
ist dies nicht korrekt, da vorhandene Dateien aktualisiert werden.quelle
--ignore-existing
Flag hinzufügen , um zu verhindern, dass vorhandene Dateien überschrieben werden.rsync -a -v --ignore-existing <src> <dst>
ist in der Tat die richtige Antwort, anstattcp -u
oben.Ist was du willst. Siehe die Manpage.
quelle
Dies funktioniert auf RedHat:
Aktualisieren und nicht überschreiben ist etwas anderes.
quelle
false
hier?-i
Fragen.Für Leute, die feststellen, dass sie keine 'n'-Option haben (wie ich bei RedHat), können Sie
cp -u
die Datei nur schreiben, wenn die Quelle neuer als die vorhandene ist (oder wenn keine vorhanden ist).[Bearbeiten] Wie in den Kommentaren erwähnt, werden dadurch ältere Dateien überschrieben, was nicht genau das ist, was das OP wollte. Verwenden Sie dafür die Antwort von Ceving.
quelle
-u
.Alpine Linux: Die folgende Antwort gilt nur für den Fall einer einzelnen Datei: In Alpine
cp -n
funktioniert es nicht (undfalse | cp -i ...
auch nicht). In meinem Fall funktioniert also eine Lösung, die ich gefunden habe:Wenn im obigen Beispiel
env.js
keine Datei vorhanden ist, kopieren wirenv.example.js
inenv.js
.quelle
Einige Versionen von cp verfügen nicht über die Option --no-clobber . In diesem Fall:
quelle