2012-06-20 7 views
39

Io uso il seguente script bash per copiare solo i file di determinate estensioni (in questo caso * .sh), tuttavia copia ancora su tutti i file. Cosa c'è che non va?copia rsync solo su determinati tipi di file usando l'opzione include

 
from=$1 
to=$2 

rsync -zarv --include="*.sh" $from $to 
+3

Pur non parlando strettamente correlato, suggerirei di quotare $ da/$ a. Non farlo potrebbe dare risultati inattesi se gli argomenti posizionali 1/2 includono spazi. –

risposta

63

Penso --include viene utilizzato per includere un sottoinsieme di file che altrimenti esclusi dai --exclude, invece di includere solo i file.

Prova invece:

rsync -zarv --include "*/" --exclude="*" --include="*.sh" "$from" "$to" 

UPDATE:

Per la versione rsync superiore 3.0.7, l'ordine deve essere modificato come segue (vedi commenti)

rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to" 

UPDATE
aggiunta '-m' bandiera, eviterà id che crea strutture di directory vuote nella destinazione. testato nella versione 3.1.2.

+9

Mentre verranno visualizzate tutte le sottodirectory, se sono presenti file .sh nelle sottodirectory che si desidera rsync, è probabile che si voglia utilizzare anche --include = "* /". –

+34

Ho provato questo su rsync versione 3.0.7, che ho ottenuto molto tempo fa da Macports, e non ha funzionato con questo ordine di include/esclude. Questo è quello che ho finito con quello che ha funzionato per me (adattato per OP): 'rsync -zarv --include =" */"--include =" *. Sh "--exclude =" * "" $ from "" $ a "'. –

+0

Il suggerimento di Bijou funziona. La risposta può essere aggiornata? – Jepper

8

Un altro Inoltre: se hai bisogno di sincronizzare i file con le sue estensioni in uno dir solo (senza di ricorsione) si dovrebbe usare una struttura come questa:

rsync -auzv --include './' --include '.ext' --exclude '*' /source/dir/ /destination/dir/ 

Fate la vostra attenzione sul puntino il primo --include. --no-r non funziona in questa costruzione.

21

La risposta di @chepner copierà tutte le sottodirectory indipendentemente dal fatto che contenga il file o meno. Se è necessario escludere le sottodirectory che non contengono il file e conservare ancora la struttura di directory, utilizzare

rsync -zarv --prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to" 
+0

Questa risposta ha funzionato perfettamente per me. +1 :) – Terry

+1

Questo era un requisito per me: "Se è necessario escludere le sottodirectory che non contengono il file e mantengono ancora la struttura di directory" +1 –

Problemi correlati