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

8

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

Ich habe den ersten Teil dieser Frage zum Stapelüberlauf erhalten :

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

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

Herr au
quelle
Meinen Sie "alle Dateien im Quellbaum in ein (bestimmtes) einzelnes Verzeichnis ohne Unterverzeichnisse kopieren"? Oder "alle Dateien im Quellbaum in ein Unterverzeichnis des Zielverzeichnisses kopieren, ähnlich wie im Quellbaum"? Ich habe die Frage als ersten Fall gelesen - können Sie die Frage zur Klärung bearbeiten? (Ich weiß, dass Sie Ihre Antwort haben, aber sie wird von anderen gelesen und verwendet.)
Volker Siegel

Antworten:

13

Sie können den Befehl -uswitch from verwenden cp:

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

oder verwenden Sie den rsyncBefehl mit --ignore-existing:

Überspringen Sie die Aktualisierung von Dateien, die auf dem Empfänger vorhanden sind

Beispiel:

rsync --ignore-existing source/* destination/
Ravexina
quelle
3

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 die Shell mit bestimmten Befehlen aufrufen und die gefundene Datei als $1Argument übergeben. Wenn dies test -e /target-directory/"$1"fehlschlägt, bedeutet dies, dass keine Datei vorhanden ist. In diesem Fall cpwird die Datei kopiert.

Im Allgemeinen kann man andere Befehle verwenden, solange der Befehl das Vorhandensein einer Datei überprüfen 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"
Sergiy Kolodyazhnyy
quelle
2
Warum statin Bash auf Dateiexistenz testen? Wäre nicht test -eviel einfacher?
David Foerster
@ DavidFoerster Kein besonderer Grund. Testbefehl reicht auch aus. Ich werde meine Antwort später bearbeiten, wenn ich nicht vergesse
Sergiy Kolodyazhnyy
0

Lesen Sie man cpund verwenden Sie die --no-clobberOption, um cp.

Walzer
quelle