Copia file ricorsiva, non sovrascrivibile?


21

Ho una directory che contiene un sacco di altre cartelle contenenti file CoffeeScript / JavaScript. Sono in grado di compilare i file CoffeeScript in una nuova cartella con la stessa struttura di cartelle bene.

Quello che voglio fare è copiare tutti i file * .js nella cartella di origine nella cartella di destinazione in modo ricorsivo. Inoltre, non voglio sovrascrivere i file già presenti nella cartella di destinazione. Qualche idea su come realizzare questo?

Ho provato a usare cp -n source/**.js desination/e cp -Rn source/**.js desination/dopo aver esaminato un'altra domanda simile, ma non sembra funzionare.

Qualche idea su come realizzare questo?


Hai dato un'occhiata a rsync?
Bonob,

@bonob Non ho. L'ho usato una o due volte, ma solo per ottenere file da remoto.
AlbertEngelB,

Risposte:


25

Puoi usare rsync (fa anche una copia locale)

rsync -r --ignore-existing --include=*/ --include=*.js --exclude=* source/ destination
  • -r ricorrere in directory,
  • --ignore-existing ignorare i file esistenti nella destinazione,
  • i filtri includee excludesignificano: include tutte le directory, include tutti i file * .js, esclude il resto; è necessaria la prima inclusione, altrimenti l'esclusione finale escluderà anche le directory prima che il loro contenuto venga scansionato.

Infine, è possibile aggiungere a -Pse si desidera vedere i progressi, a --list-onlyse si desidera vedere cosa verrà copiato senza effettivamente copiarlo e a -tse si desidera conservare i timestamp.


Questo non è correlato, ma ho imparato di recente il comando rsync, quando ho spostato 15 anni di documenti da una partizione all'altra. Fiducioso che i miei file fossero lì, ho quindi cancellato la vecchia partizione e messo dentro altre cose; In seguito mi sono reso conto di aver perso tutti i timestamp e ho scoperto la bandiera -t. Volevo solo condividere il mio disagio: '(


Haha, questo ha funzionato! rsyncapparentemente è la bomba.
AlbertEngelB,

3
Sì, lo so a malapena, ma ho imparato molto a riguardo cercando di rispondere alla tua domanda. Se è necessario andare oltre in futuro, è possibile definire filtri complessi nei file e chiamarli nel comando, ad esempio. Puoi anche avere filtri per directory, comprimere i dati durante la copia e questo è solo graffiarne la superficie!
Bonob

7

Ciò è ottenibile anche usando cp. Vedere qui:

sudo cp -vnpr /xxx/* /yyy

xxx = fonte

yyy = destinazione

v = dettagliato

n = no clobber (no overwrite)

p = conserva le autorizzazioni

r = ricorsivo


5

Guardando le pagine man sembra che tu voglia l' -nopzione.

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

Ho provato a usare -n, tuttavia non mi consente di filtrare per file * .js.
AlbertEngelB,

0

La mia distribuzione non disponeva di clobber, quindi:

echo n | cp -vipr xxx yyy

xxx = fonte

yyy = destinazione

v = dettagliato

i = interattivo (richiesta di sovrascrittura) | ecco perché il comando è preceduto da "echo n |"

p = conserva le autorizzazioni

r = ricorsivo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.