2012-03-31 15 views
32

Tengo problemas para obtener mi sintaxis de rsync correcta y me pregunto si mi escenario se puede manejar con rsync. En primer lugar, he confirmado que rsync funciona perfectamente entre mi host local y mi host remoto. Hacer una sincronización directa en un directorio es exitoso.Uso de Rsync para incluir y excluir opciones para incluir directorio y archivo por patrón

Esto es lo que se ve mi sistema de archivos como:

uploads/ 
    1260000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 
    1270000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 
    1280000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 

Lo que quiero hacer es rsync ejecutarse sólo en los archivos que comienzan con "file_11_" en los subdirectorios y quiero ser capaz de ejecutar un solo trabajo rsync para sincronizar todos estos archivos en los subdirectorios.

Aquí está el comando que estoy tratando:

rsync -nrv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

Esto se traduce en 0 archivos que se están marcadas para su transferencia en mi funcionamiento en seco. Probé varias otras combinaciones de sentencias --include y --exclude, pero continué sin obtener resultados o obtuve todo como si no se hubieran establecido opciones de inclusión o exclusión.

¿Alguien tiene alguna idea de cómo hacer esto?

Respuesta

67

El problema es que --exclude="*" dice a excluir (por ejemplo) el directorio 1260000000/, por lo rsync nunca se examina el contenido de ese directorio, por lo que nunca se da cuenta de que el directorio contiene archivos que han sido emparejados por su --include.

creo que lo más parecido a lo que quiere es la siguiente:

rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(que incluirá todos los directorios y todos los archivos que coinciden con file_11*.jpg, pero no otros archivos), o quizá esto:

rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(mismo concepto, pero mucho más selectivos acerca de los directorios incluirá).

+1

Gracias! Eso era exactamente lo que necesitaba. Mi escenario fue en realidad más o menos lo que describiste en tu segundo ejemplo, pero mantuve mi pregunta simplificada para hacer la pregunta más directa. –

+0

@SheldonChang: ¡De nada! – ruakh

+5

Tenga en cuenta la importancia de (por ejemplo) '--include =" */"' al incluir los directorios ** padres ** de los archivos que realmente desea incluir. – mabraham

7

Agregue -m a la respuesta recomendada anterior para eliminar directorios vacíos.

2

rsync incluyen excluir Ejemplos de patrones:

"*"   means everything 
"dir1"  transfers empty directory [dir1] 
"dir*"  transfers empty directories like: "dir1", "dir2", "dir3", etc... 
"file*"  transfers files whose names start with [file] 
"dir**"  transfers every path that starts with [dir] like "dir1/file.txt", "dir2/bar/ffaa.html", etc... 
"dir***" same as above 
"dir1/*" does nothing 
"dir1/**" does nothing 
"dir1/***" transfers [dir1] directory and all its contents like "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc... 

y última nota es que simplemente dont dependen de asteriscos que se utilizan en el principio de evaluación de caminos; como "**dir" (está bien usarlos para carpetas individuales o archivos pero no rutas) y tenga en cuenta que más de dos asteriscos no funcionan para nombres de archivos.

+0

Su respuesta es la única que se puede usar porque explica el comportamiento general. Las otras respuestas son demasiado específicas según el OP, pero cada situación necesita otra solución. ¡Me ayudó mucho! –

+0

@AlBundy ¡Estoy contento! – TechJS

Cuestiones relacionadas