Rekursives, nicht überschreibendes Kopieren von Dateien?

21

Ich habe ein Verzeichnis, das eine Reihe anderer Ordner enthält, die CoffeeScript / JavaScript-Dateien enthalten. Ich bin in der Lage, die CoffeeScript-Dateien in einen neuen Ordner mit der gleichen Ordnerstruktur zu kompilieren.

Ich möchte lediglich alle * .js-Dateien im Quellordner rekursiv in den Zielordner kopieren. Ich möchte auch keine Dateien überschreiben, die bereits im Zielordner vorhanden sind. Irgendwelche Gedanken darüber, wie dies erreicht werden kann?

Ich habe versucht, cp -n source/**.js desination/und zu verwenden, cp -Rn source/**.js desination/nachdem ich mir eine ähnliche Frage angesehen habe, aber es scheint nicht zu funktionieren.

Irgendeine Idee, wie das erreicht werden kann?

AlbertEngelB
quelle
Hast du dir rsync angeschaut?
Bonob
@bonob habe ich nicht nein. Ich habe es ein- oder zweimal verwendet, aber nur, um Dateien aus der Ferne abzurufen.
AlbertEngelB

Antworten:

25

Du könntest rsync benutzen (es kopiert auch lokal)

rsync -r --ignore-existing --include=*/ --include=*.js --exclude=* source/ destination
  • -r in Verzeichnisse zu rekursieren,
  • --ignore-existing im Ziel vorhandene Dateien zu ignorieren,
  • Die Filter includeund excludebedeuten: Alle Verzeichnisse einschließen, Alle * .js-Dateien einschließen, den Rest ausschließen. Das erste Include wird benötigt, andernfalls schließt das endgültige Exclude auch Verzeichnisse aus, bevor deren Inhalt gescannt wird.

Schließlich können Sie ein hinzufügen, -Pwenn Sie den Fortschritt verfolgen möchten, ein, --list-onlywenn Sie sehen möchten, was kopiert werden soll, ohne tatsächlich zu kopieren, und ein, -twenn Sie die Zeitstempel beibehalten möchten.


Dies ist nicht verwandt, aber ich habe kürzlich den Befehl rsync gelernt, als ich 15 Jahre Dokumente von einer Partition auf eine andere verschoben habe. Ich war mir sicher, dass meine Dateien dort waren, löschte dann die alte Partition und legte ein paar andere Sachen hinein. Später stellte ich fest, dass ich alle Zeitstempel verloren hatte und entdeckte die -t-Flagge. Ich wollte nur meine Not mitteilen: '(

Bonob
quelle
Haha, das hat funktioniert! rsyncanscheinend ist die Bombe.
AlbertEngelB
3
Ja, ich weiß es kaum, habe aber viel darüber gelernt, indem ich versucht habe, deine Frage zu beantworten. Wenn Sie in Zukunft noch weiter gehen müssen, können Sie komplexe Filter in Dateien definieren und diese beispielsweise im Befehl aufrufen. Sie können auch nach Verzeichnissen filtern, Daten beim Kopieren komprimieren und das kratzt nur an der Oberfläche!
Bonob
7

Dies ist auch mit cp möglich. Siehe hier:

sudo cp -vnpr /xxx/* /yyy

xxx = Quelle

JJJ = Ziel

v = ausführlich

n = kein Clobber (kein Überschreiben)

p = Berechtigungen beibehalten

r = rekursiv

SEMbyotic
quelle
5

Wenn Sie sich die -nHandbuchseiten ansehen, möchten Sie anscheinend die Option.

-n, --no-clobber
   do not overwrite an existing file (overrides the previous -i option)
Tantal
quelle
Ich habe versucht, -n zu verwenden, kann jedoch nicht nach * .js-Dateien filtern.
AlbertEngelB
0

Meine Distribution hatte keinen Clobber zur Verfügung, also:

echo n | cp -vipr xxx yyy

xxx = Quelle

JJJ = Ziel

v = ausführlich

i = interaktiv (Aufforderung zum Überschreiben) | Deshalb steht vor dem Befehl "echo n |"

p = Berechtigungen beibehalten

r = rekursiv

Octavian
quelle