solo - rsync remoto
¿Cómo sincronizar solo una lista específica de archivos? (4)
Es posible que le resulte más fácil, si está buscando una lista específica de archivos, colocarlos directamente en la línea de comando:
# rsync -avP -e ssh `cat deploy/rsync_include.txt` [email protected]:/var/www/
Sin embargo, esto supone que su lista no es tan larga que la longitud de la línea de comando será un problema y que el archivo rsync_include.txt
contiene solo rutas reales (es decir, sin comentarios y sin expresiones regulares).
Tengo alrededor de 50 archivos en varios subdirectorios que me gustaría enviar a un servidor remoto. Pensé que rsync podría hacer esto por mí usando la opción --include-from. Sin la opción --exclude = "*", todos los archivos en el directorio se sincronizan, con la opción, no hay archivos.
rsync -avP -e ssh --include-from=deploy/rsync_include.txt --exclude=* ./ [email protected]:/var/www/ --dry-run
Lo estoy ejecutando como inicialmente seco y 0.0.0.0 obviamente es reemplazado por el IP del servidor remoto. El contenido de rsync_include.txt es una nueva lista separada por líneas de rutas relativas a los archivos que quiero cargar.
¿Hay alguna manera mejor de hacer esto que me escape un lunes por la mañana?
Hay una bandera --files-from
que hace exactamente lo que quiere. De man rsync
:
--files-from=FILE
El uso de esta opción le permite especificar la lista exacta de archivos para transferir (como leídos del ARCHIVO especificado o - para la entrada estándar). También modifica el comportamiento predeterminado de rsync para facilitar la transferencia de los archivos y directorios especificados más fácilmente:
La opción --relativa (-R) está implícita, lo que preserva la información de ruta que se especifica para cada elemento en el archivo (use --no-relative o --no-R si desea desactivarlo).
La opción --dirs (-d) está implícita, lo que creará directorios especificados en la lista en el destino en lugar de omitirlos ruidosamente (use --no-dirs o --no-d si desea desactivarlo).
El comportamiento de la opción --archive (-a) no implica --recursive (-r), así que especifíquelo explícitamente, si lo desea.
Estos efectos secundarios cambian el estado predeterminado de rsync, por lo que la posición de la opción --files-from en la línea de comandos no tiene relación con la forma en que se analizan otras opciones (por ejemplo, -a funciona igual antes o después de --files- desde, al igual que --no-R y todas las demás opciones).
Los nombres de archivo que se leen desde el ARCHIVO son todos relativos al directorio de origen: se eliminan las barras diagonales principales y no se permite que las referencias ".." vayan más allá del directorio de origen. Por ejemplo, toma este comando:
rsync -a --files-from=/tmp/foo /usr remote:/backup
Si / tmp / foo contiene la cadena "bin" (o incluso "/ bin"), el directorio / usr / bin se creará como / backup / bin en el host remoto. Si contiene "bin /" (observe la barra al final), también se enviarán los contenidos inmediatos del directorio (sin necesidad de mencionarlo explícitamente en el archivo, esto comenzó en la versión 2.6.4). En ambos casos, si la opción -r estaba habilitada, la jerarquía completa de ese directorio también se transferiría (tenga en cuenta que -r necesita especificarse explícitamente con --files-from, ya que no está implícito en -a). También tenga en cuenta que el efecto de la opción (habilitada por defecto) --relativa es duplicar solo la información de ruta que se lee del archivo - no fuerza la duplicación de la ruta de la fuente de especificación (/ usr en este caso) .
Además, el archivo --files-from se puede leer desde el host remoto en lugar del host local si especifica un "host:" delante del archivo (el host debe coincidir con un extremo de la transferencia). Como atajo, puede especificar solo un prefijo de ":" para significar "usar el extremo remoto de la transferencia". Por ejemplo:
rsync -a --files-from=:/path/file-list src:/ /tmp/copy
Esto copiará todos los archivos especificados en el archivo / ruta / lista de archivos que se encuentra en el host "src" remoto.
Si se especifican las opciones --iconv y --protect-args y se envían los archivos -files desde un host a otro, los nombres de los archivos se traducirán del juego de caracteres del anfitrión emisor al juego de caracteres del anfitrión receptor.
NOTA: ordenar la lista de archivos en la entrada --files-from ayuda a rsync a ser más eficiente, ya que evitará volver a visitar los elementos de ruta que se comparten entre las entradas adyacentes. Si la entrada no está ordenada, algunos elementos de ruta (directorios implícitos) pueden ser escaneados varias veces, y rsync eventualmente los duplicará después de convertirse en elementos de lista de archivos.
Para el registro, ninguna de las respuestas anteriores ayudó, excepto una. Para resumir, puede hacer la operación de copia de seguridad utilizando --files-from=
utilizando:
rsync -aSvuc `cat rsync-src-files` /mnt/d/rsync_test/
O
rsync -aSvuc --recursive --files-from=rsync-src-files . /mnt/d/rsync_test/
El primer comando se explica por sí mismo, junto al contenido del archivo rsync-src-files
que detallaré a continuación. Ahora, si desea utilizar la última versión, debe tener en cuenta los siguientes cuatro comentarios:
- Aviso uno necesita especificar tanto
--files-from
como el directorio fuente - Uno necesita especificar explícitamente
--recursive
. - El archivo
rsync-src-files
es un archivo creado por el usuario y se colocó dentro del directorio src para esta prueba - Los
rsyn-src-files
contienen los archivos y las carpetas para copiar y se toman en relación con el directorio de origen. IMPORTANTE: asegúrese de que no haya espacios al final ni líneas en blanco en el archivo. En el siguiente ejemplo, solo hay dos líneas, no tres (figúrela por casualidad). El contenido dersynch-src-files
es:
folderName1
folderName2
--files-from=
parámetro necesita una barra inclinada si desea mantener la ruta absoluta intacta. Entonces tu comando se convertiría en algo como lo siguiente:
rsync -av --files-from=/path/to/file / /tmp/
Esto se puede hacer como si hubiera una gran cantidad de archivos y desea copiar todos los archivos a la ruta x. De modo que encontraría los archivos y arrojaría la salida a un archivo como el siguiente:
find /var/* -name *.log > file