2011-11-25 19 views
19

Sto provando a copiare un progetto sul mio server con rsync. Ho progetto specifico script di installazione in una sottodirectoryrsync esclude una directory ma include una sottodirectory

progetto/spec/install/project1

Quello che sto cercando di fare è di escludere tutto nel/spec directory progetto, ma il progetto specifica directory di installazione : progetto/specifiche/installazione/progetto1.

rsync -avz --delete --include=specs/install/project1 \ 
    --exclude=specs/* /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

Ma così il contenuto della directory specs viene escluso ma la directory install/project1 non viene inclusa.

Ho provato di tutto, ma io proprio non riesco a ottenere questo al lavoro

+1

Ho appena trovato una domanda simile su linuxquestions.org che può aiutare: http://www.linuxquestions.org/questions/linux-software-2/rsync-include-exclude-problems-636504/ – Chris

+0

Grazie, che ha risolto esso! A volte Rsync ha una strana logica. – user1036651

+0

duplicati http://stackoverflow.com/questions/7960669/with-rsync-how-do-includes-and-excludes-combine/7961687#7961687 –

risposta

29

A volte è solo un dettaglio.

Basta cambiare il tuo modello includono l'aggiunta di un finale/alla fine di includere il pattern e funzionerà:

rsync -avz --delete --include=specs/install/project1/ \ 
    --exclude=specs/* /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

O, in alternativa, preparare un file di filtro come questo:

$ cat <<EOF>pattern.txt 
> + specs/install/project1/ 
> - specs/* 
> EOF 

quindi utilizzare l'opzione --Filter:

rsync -avz --delete --filter=". pattern.txt" \ 
    /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

per maggiori informazioni vai alla sezione regole di filtraggio nel rsync (1) pagina di manuale.

+2

Le regole di filtro sono infatti l'unico modo corretto per gestire qualsiasi cosa più complicata di "escludi tutte le directory .git". –

8

L'altra soluzione non funziona qui.


modo affidabile

Non hai scelta, ma a scendere manualmente per ogni livello del vostro sub-directory. Non vi è alcun rischio di includere file indesiderati, dato che rsync non include i file delle directory incluse.

1) Creare un include file di filtro, per esempio "include_filter.txt":

+ /specs/ 
+ /specs/install/ 
+ /specs/install/project1/*** 
- /specs/** 

2) eseguirlo:

rsync -avz --delete --include-from=include_filter.txt \ 
    /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 
  • Non dimenticare la barra di partenza "/ ", altrimenti potresti abbinare le sottodirectory" **/specs/install/project1/".
  • Scegliendo un filtro del tipo di inclusione (--include-from = FILE), i segni "+" iniziali sono in realtà opzionali, poiché si tratta dell'azione predefinita senza segno. (Puoi avere l'opposto "-" di default con --exclude-from = FILE.)
  • Le stelle doppie "**" significa "qualsiasi percorso"
  • Le stelle triple "***" significa "qualsiasi percorso, tra cui questo molto directory"

Modo semplice

È possibile avviare i filtri "* /", che consente di scendere rsync tutti i sotto-livelli. Questo è conveniente ma:

  • Tutte le directory saranno incluse, anche se vuote. Questo può essere risolto con l'opzione rysnc -m, ma tutte le directory vuote verranno saltate.

1) Creare un file di filtro di includere, per esempio "include_filter.txt":

+ /**/ 
+ /specs/install/project1/*** 
- /specs/** 

2) eseguirlo:

rsync -avzm --delete --include-from=include_filter.txt \ 
    /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

Nota l'opzione -m aggiunto.

Problemi correlati