rsync no habla regex. Puedes alistar find y grep, aunque se vuelve un poco arcano. Para encontrar los archivos de destino:
find a/ |
grep -i 'name'
Pero todos tienen el prefijo "a /", lo cual tiene sentido, pero lo que queremos terminar es una lista de patrones de inclusión aceptables para rsync, y como el prefijo "a /" no funciona para rsync I ' Lo quitaré con corte:
find . |
grep -i 'name' |
cut -d / -f 2-
Todavía hay un problema: seguiremos perdiendo archivos en subdirectorios, porque rsync no busca directorios en la lista de exclusión. Voy a usar awk para agregar los subdirectorios de cualquier archivo coincidente a la lista de patrones de inclusión:
find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}'
Todo lo que queda es enviar la lista a rsync; podemos usar el argumento --include-from = - para proporcionar una lista de patrones para rsync en la entrada estándar. Entonces, en conjunto:
find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/
Tenga en cuenta que se hace referencia al directorio de origen 'a' a través de dos rutas diferentes: "a /" y "./a/". Esto es sutil pero importante. Para hacer las cosas más consistentes, haré un cambio final y siempre me referiré al directorio de origen como "./a/". Sin embargo, esto significa que el comando de corte tiene que cambiar ya que habrá un "./" adicional en la parte frontal de los resultados de find:
find ./a/ |
grep -i 'name' |
cut -d / -f 3- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/
--exclude='*'
?