2009-03-02 14 views
19

Sto cercando di fare una copia specifica in Fedora.Come posso copiare ricorsivamente una directory in un'altra e sostituire solo i file che non sono stati modificati?

ho due cartelle:

  • 'Webroot': lo svolgimento di tutti i file Web/immagini ecc

  • 'esportazione': cartella che contiene migliaia di PHP, CSS, documenti JS che vengono esportati da il mio repository SVN.

La directory di esportazione contiene molti degli stessi file/cartelle della radice, tuttavia la radice contiene altri file non trovati in esportazione.

mi piacerebbe unire tutti i contenuti di esportazione con il mio Webroot con le seguenti opzioni:

  1. sovrascrivere il file in Webroot se la versione di esportazione contiene codice diverso da quello che è all'interno della versione di Webroot (vivere)
  2. preservare i permessi/utenti/gruppi di file, se viene sovrascritto (la versione di esportazione sostituendo la versione live) * NOTA Vorrei che il webroots permessi/proprietà mantenuta, ma con contenuti di esportazione
  3. nessun suggerimento/arresto della copia di qualsiasi tipo (cioè non verbose)
  4. ricorsivo copia - ovviamente mi piacerebbe copiare tutti i file * cartelle e sottocartelle trovano in esportazione

Ho fatto un po 'di ricerca in cp - sarebbe questo fare il lavoro ?:

cp -pruf ./export /path/to/webroot 
+0

Si noti che il primo criterio non è chiaro. Le risposte per lo più presumono che tu intenda "se il file in webroot è più recente del file in esportazione, lascia stare". Se intendi veramente "confrontare i contenuti e copiare la versione di esportazione se c'è una differenza", copia semplicemente tutto ... continua ... –

+0

... continua ... come appariranno i nuovi file e i vecchi file che sono lo stesso in entrambi sarà lo stesso dopo la copia, tranne forse per il tempo di modifica. –

+0

Grazie per questo feedback - aggiornerò la domanda – barfoon

risposta

24

Potrebbe, ma ogni volta che i file corrispondenti in export e webroot hanno lo stesso contenuto ma tempi di modifica diversi, si finirebbe con un'operazione di copia non necessaria. si sarebbe probabilmente ottenere un comportamento un po 'più intelligente da rsync:

rsync -pr ./export /path/to/webroot 

Inoltre, rsync possibile copiare i file da un host ad un altro tramite una connessione SSH, se mai la necessità di farlo. Inoltre, ha una gamma di opzioni che puoi specificare per modificarne il comportamento: guarda nella pagina man per i dettagli.

MODIFICA: per quanto riguarda i chiarimenti su cosa intendi preservando le autorizzazioni: probabilmente vorrai interrompere l'opzione -p.

6
  1. -u sovrascrive cartella i file esistenti se la destinazione è più vecchio di fonte
  2. -p perserves il permesso e risale
  3. -f si spegne verbosità
  4. -r fa la copia ricorsiva

Così sembra che hai tutti i args corrette per cp

5

suona come un lavoro per cpio (e quindi, probabilmente, GNU tar puo 'farlo):

cd export 
find . -print | cpio -pvdm /path/to/webroot 

Se avete bisogno di proprietari conservati, è necessario farlo come root, naturalmente. L'opzione -p è "pass mode", ovvero copia tra le posizioni; -v è dettagliato (ma non interattivo, c'è una differenza); -d significa creare directory come necessario; -m significa risparmiare tempo di modifica. Per impostazione predefinita, senza l'opzione -u, cpio non sovrascrive i file nell'area di destinazione più recenti rispetto a quelli dell'area di origine.