it-swarm.com.de

Kopieren Sie jede Datei in einer Verzeichnisstruktur nur dann in einen bestimmten Pfad, wenn dort noch keine Datei vorhanden ist

Möchte nur dann jede Datei aus einer Verzeichnisstruktur in ein bestimmtes Verzeichnis kopieren, wenn dort noch keine Datei vorhanden ist.

Habe den ersten Teil von diese Frage zum Stapelüberlauf :

find . -type f -exec cp {} /target-directory \;

Wie kann ich überprüfen, ob die Datei existiert oder nicht? Wenn nicht, kopieren Sie die Datei, andernfalls überspringen.

8
mr au

Sie können -u verwenden, um von cp zu wechseln:

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

oder verwenden Sie den Befehl rsync mit --ignore-existing:

überspringen Sie die Aktualisierung der auf dem Receiver vorhandenen Dateien

Beispiel:

rsync --ignore-existing source/* destination/
13
Ravexina

Ihr ursprünglicher Befehl kann wie folgt umgeschrieben werden:

find . -type f -exec bash -c 'test -e /target-directory/"$1" || cp "$1" /target-directory' sh {} \;

Der Schlüssel hier ist, dass wir Shell mit bestimmten Befehlen aufrufen und die gefundene Datei als $1 Argument übergeben. Wenn test -e /target-directory/"$1" fehlschlägt, bedeutet dies, dass die Datei nicht vorhanden ist. In diesem Fall kopiert cp die Datei.

Im Allgemeinen kann man andere Befehle verwenden, solange der Befehl das Vorhandensein einer Datei verifizieren kann. Einige der anderen Alternativen:

  • /usr/bin/realpath -e /target-directory/"$1" > /dev/null || cp "$1" /target-directory
  • stat >/dev/null /target-directory/"$1" || cp "$1" /target-directory/"$1"
3

Lesen Sie man cp und verwenden Sie die Option --no-clobber für cp.

0
waltinator