2012-06-20 19 views
39

Utilizo el siguiente script bash para copiar solo archivos de cierta extensión (en este caso * .sh), sin embargo, sigue copiando sobre todos los archivos. ¿Qué pasa?rsync copia solo ciertos tipos de archivos usando la opción incluir

 
from=$1 
to=$2 

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

Aunque no es estrictamente hablando relacionada, sugeriría citando $ desde/$ a. Si no lo hace, puede obtener resultados inesperados si los argumentos posicionales 1/2 incluyen espacios. –

Respuesta

63

Creo --include se utiliza para incluir un subconjunto de archivos que se excluyen de otra manera por --exclude, en lugar de incluir sólo aquellos archivos.

Procurad, más bien:

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

ACTUALIZACIÓN:

Para la versión 3.0.7 rsync mayor que, el orden debe ser modificada de la siguiente manera (ver comentarios)

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

ACTUALIZACIÓN
agregando el indicador '-m', se evitará Identificación creando estructuras de directorio vacías en el destino. probado en la versión 3.1.2.

+9

Si bien obtendrá todos los subdirectorios, si hay archivos .sh en los subdirectorios que desea sincronizar, es probable que desee utilizar --include = "* /" también. –

+34

Intenté esto en rsync versión 3.0.7, que obtuve hace mucho tiempo de macports, y no funcionó con este orden de includes/excludes. Esto es lo que terminé con lo que funcionó para mí (adaptado para OP): 'rsync -zarv --include =" */"--include =" *. Sh "--exclude =" * "" $ from "" $ a "'. –

+0

La sugerencia de Bijou funciona. ¿Puede la respuesta ser actualizada? – Jepper

8

Uno más además: si necesita sincronizar archivos por sus extensiones en uno dir solamente (sin la recursividad), debe usar una construcción como esta:

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

Pague su atención sobre el punto en el primer --include. --no-r no funciona en esta construcción.

21

La respuesta de @chepner copiará todos los subdirectorios independientemente de si contiene el archivo o no. Si necesita excluir los subdirectorios que No contener el archivo y seguir manteniendo la estructura de directorios, utilice

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

Esta respuesta funcionó perfectamente para mí. +1 :) – Terry

+1

Esto era un requisito para mí: "Si necesita excluir los subdirectorios que no contienen el archivo y aún retienen la estructura de directorios" +1 –

Cuestiones relacionadas