Error al intentar hacer más fácil el comando rsync
Pregunta
Normalmente uso scp para copiar cosas, pero ahora estoy tratando de acostumbrarme al comando rsync más potente. Me ayuda a usar menos ancho de banda copiando solo los archivos que han cambiado. Sin embargo, rsync tiene muchos parámetros complejos, así que pensé, oye, haré un pequeño script de Bash que me lo facilite, y llamaré al comando 'rscp'. Entonces, me fui a construir algo como esto. Observe en el siguiente ejemplo que mi proveedor de alojamiento web usa un número de puerto diferente además del 22, por eso se usa el $ 1 para eso.
#!/bin/bash
rsync -avzp --progress --rsh='ssh -p$1' $2 $3 $4 $5 $6 $7
Entonces, su uso, esperaba, sería algo así como:
rscp 3822 --exclude=tiny_mce /var/www/mysite/* root@webhost.com:~/www/mysite
Eso lo acercaría un poco más a mi uso del comando scp, ya ves.
Sin embargo, cuando ejecuté esto, recibí este error:
building file list ...
4 files to consider
ERROR: destination must be a directory when copying more than 1 file
rsync error: errors selecting input/output files, dirs (code 3) at main.c(494) [receiver=2.6.9]
rsync: connection unexpectedly closed (8 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(454) [sender=2.6.9]
Pero si vuelvo al comando rsync normal, funciona bien.
¿Alguien puede descubrir qué estoy haciendo mal en mi script Bash?
Solución
/ var / www / mysite / * se expande por el shell, por lo que se pasan muchos más argumentos de los que se manejan en el script.
Además, las variables no se sustituyen entre comillas simples, por lo que debe utilizar comillas dobles. (Consulte bash página de manual )
Prueba esto:
#!/bin/bash
PORT=$1
shift
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"
Primero sacamos el puerto de la lista de argumentos (con shift), luego usamos " $ @ " que es especial, se refiere al argumento (al guión en este caso), y se convierte a todos ellos, pero cada uno por separado entre comillas dobles. (consulte la
Otros consejos
¿Técnicamente no podrías convertir esto también en una función ?:
rscp() {
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"
}
Y luego cuando lo ejecutas: rscp 3822