Tengo un archivo de texto que contiene una lista de directorios con su ruta absoluta
$ cat DirectoriesToCopy.txt
/data/Dir1
/data/Dir2
Quiero usar rsync para copiar todos estos directorios conservando su ruta absoluta a otra ubicación.
Intenté el siguiente comando rsync, pero no funciona
rsync -avr --include-from=DirectoriesToCopy.txt --exclude='*/' --exclude='/*' / /media/MyDestination/
¿Qué está mal aquí?

/data/Dir1e/data/Dir2incluir sus contenidos a/media/MyDestination/Dir1y/media/MyDestination/Dir2? ¿O quieres incluir la/dataparte? ¿Qué tan grande es esta lista? ¿Es demasiado grande para simplemente enumerar esas entradas en la línea de comando? De todos modos, sus--excludedeclaraciones evitan la recurrencia./media/MyDestination/data/Dir2/. Agregué --exclude para evitar que se copien otros directorios y archivos en /.rsync -av $(cat DirectotiesToCopy.txt) /media/MyDestination/Respuestas:
Use el siguiente comando:
Debe incluir / data / explícitamente, también podría haberlo agregado a la lista en el archivo. Luego excluya todos los demás directorios (el orden es importante con incluye / excluye).
Tenga en cuenta que su uso de
-rera redundante, ya que está incluido en-a.EDITAR: También podría lograr el mismo resultado con:
No es rsync lo que te obliga a hacer cosas difíciles solo para copiar un par de directorios, solo te brinda múltiples formas de hacer lo mismo; en algunos casos, la opción de incluir / excluir puede ser más adecuada, aquí haría lo --relativo anterior (sin
--relativeque termine con ,/media/MyDestination/Dir1y/media/MyDestination/Dir2con--relativetoda la ruta de origen copiada al destino).fuente
rsync -av --relative $(cat DirectotiesToCopy.txt) /media/MyDestination/--relativees solo otra opción.No use
--includeni--filtervariaciones, ya que eso solo confundirá las cosas. En cambio, use--files-from=_filename_. (Si lo hace, asegúrese de hacer muchas pruebas).Cree la lista de directorios en un archivo, un directorio / archivo por línea.
Use rsync's
--files-from=con el archivo de arriba.Use la opción
--relative/-Rpara asegurarse de que los nombres de ruta de origen se copien al final del destino.Incluso si tiene la
-aopción, también incluya-r. Desde la página del manual:Comando completo:
(los archivos en list_of_files.txt deben ser relativos o encontrarse en el directorio de nivel superior )
(si DEBUG está configurado, rsync simplemente imprime lo que podría haberse copiado).
fuente
--include-fromtambién funcionará, pero lo que dije sobre-res en gran medida irrelevante.El manual de rsync advierte sobre este escenario (sección "Incluir / excluir reglas de patrón"):
En su caso, creo que el enfoque más sencillo sería para preprocesar la lista de directorios para incluir de manera que cada vez que incluyes
/path/to/foo, que también incluyen todos los directorios padre (/path/to,/path,/), y también incluyen los subdirectorios de los directorios originales (/path/to/foo/***), y después de todo esto tiene una regla que excluye todo lo que no se haya enumerado anteriormente (*).fuente