¿Cómo RSYNC un solo archivo?

95

Actualmente solo RSync-ing Directoriescomo:

* * * * * rsync -avz /var/www/public_html/images root@<remote-ip>:/var/www/public_html

Entonces, ¿cómo hago para rsyncun solo archivo /var/www/public_html/.htaccess?

夏 期 劇場
fuente

Respuestas:

160

Lo hace de la misma manera que lo haría con un directorio, pero especifica la ruta completa al nombre del archivo como fuente. En tu ejemplo:

rsync -avz   --progress  /var/www/public_html/.htaccess root@<remote-ip>:/var/www/public_html/

Como se mencionó en los comentarios: dado que -aincluye recurse , un pequeño error tipográfico puede hacer que inicie una transferencia completa del árbol de directorios, por lo que un enfoque más infalible podría simplemente usarlo -vzo reemplazarlo -lptgoD.

Michael Place
fuente
19
Además, si solo envía un archivo, es posible que desee agregar el parámetro "--progress" para que pueda ver su progreso.
JoshStrange
¿Significa esto que todavía necesita un módulo en rsyncd.conf con un directorio encima del archivo (por ejemplo, con la opción de rechazar eliminar), o puede cargar archivos en cualquier lugar del servidor simplemente especificando su ruta? La página de manual no es muy clara al respecto.
3
-a incluye recursivo y eso no es necesario para un solo archivo, no estoy seguro de si usaría ese indicador para un solo archivo, ya que puede provocar un comportamiento no deseado si el nombre del archivo por accidente se convierte en un directorio.
redanimalwar
2
--partial --stats --progress << Estos indicadores son útiles si se trata de un archivo muy grande y es posible que deba reanudarse después de una transferencia interrumpida.
Ahi Tuna
16

Sintaxis básica

rsync options source destination

Ejemplo

rsync -az /var/www/public_html/filename root@<remote-ip>:/var/www/public_html

Lee mas

Techie
fuente
14

La respuesta de Michael Place funciona muy bien si, en relación con el directorio raíz tanto para el origen como para el destino, todos los directorios en la ruta del archivo ya existen.

Pero, ¿qué sucede si desea sincronizar un archivo con esta ruta de origen?

/ source-root / a / b / archivo

a un archivo con la siguiente ruta de destino:

/ target-root / a / b / archivo

y los directorios a y b no existen?

Necesita ejecutar un comando rsync como el siguiente:

rsync -r --include="/a/" --include="/a/b/" --include="/a/b/file" --exclude="*" [source] [target]
Kenny Evitt
fuente
2
¿No sería más seguro simplemente copiar el archivo individual en una carpeta existente o crear las carpetas por adelantado? En el caso de la sincronización de carpetas o contenido de carpetas, rsync cree todas las subcarpetas, después de todo es su trabajo, pero en este caso particular es demasiado complicado y los parámetros --include solo para copiar archivos individuales.
Tulains Córdova
@ user1598390 No estoy seguro de qué escenario está asumiendo, o imaginando, donde esto sería menos seguro, pero si estuviera tratando de recordar la forma específica de este comando y no lo hizo con frecuencia, entonces sí, probablemente sea menos seguro que copiar el archivo único. Puede ser más seguro si el archivo es grande, es decir, porque rsync maneja automáticamente la mayoría de los errores que pueden ocurrir durante la copia. Para algún contexto, mi sintaxis fue particularmente útil para mí porque había escrito código que generaba comandos en esta forma, así que, dadas las pruebas suficientes que cubren el código relevante, estos comandos son 'seguros'.
Kenny Evitt
0

Hasta la fecha, dos de las respuestas no son del todo correctas, obtendrán más de un archivo y el otro no es tan simple como podría ser, aquí hay una respuesta más simple en mi opinión.

Lo siguiente obtiene exactamente un archivo, pero debe crear el directorio dest con mkdir. Esta es probablemente la opción más rápida:

mkdir -p ./local/path/to/file
rsync user@remote:/remote/path/to/file/ -zarv --include "filename" --exclude "*" ./local/path/to/file/

Si solo hay una instancia de archivo en / remote / path, rsync puede crear directorios por usted si hace lo siguiente. Esto probablemente llevará un poco más de tiempo porque busca en más directorios. Además, creará directorios vacíos para directorios en / remote / path que no están en ./local

cd ./local
rsync user@remote:/remote/path -zarv --include "*/" --include "filename" --exclude "*" .

Tenga en cuenta que el orden de --incluir y --excluir importa.

Samuel
fuente