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/Dir1
e/data/Dir2
incluir sus contenidos a/media/MyDestination/Dir1
y/media/MyDestination/Dir2
? ¿O quieres incluir la/data
parte? ¿Qué tan grande es esta lista? ¿Es demasiado grande para simplemente enumerar esas entradas en la línea de comando? De todos modos, sus--exclude
declaraciones 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
-r
era 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
--relative
que termine con ,/media/MyDestination/Dir1
y/media/MyDestination/Dir2
con--relative
toda la ruta de origen copiada al destino).fuente
rsync -av --relative $(cat DirectotiesToCopy.txt) /media/MyDestination/
--relative
es solo otra opción.No use
--include
ni--filter
variaciones, 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
/-R
para asegurarse de que los nombres de ruta de origen se copien al final del destino.Incluso si tiene la
-a
opció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-from
también funcionará, pero lo que dije sobre-r
es 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