2008-11-16 2 views
2

Обычно я использую scp для копирования материала, но теперь я пытаюсь привыкнуть к более мощной команде rsync. Это помогает мне использовать меньшую пропускную способность, копируя только те файлы, которые были изменены. Тем не менее, rsync имеет множество сложных параметров, поэтому я подумал, эй, я просто сделаю небольшой скрипт Bash, который упростит для меня, и вызовет команду «rscp». Итак, я пошел строить что-то вроде этого. Обратите внимание в примере ниже, что мой веб-хост использует другой номер порта, кроме 22, поэтому для этого используется $ 1.Ошибка при попытке упростить команду rsync

#!/bin/bash 

rsync -avzp --progress --rsh='ssh -p$1' $2 $3 $4 $5 $6 $7 

Таким образом, его использование, я надеялся, будет что-то вроде:

rscp 3822 --exclude=tiny_mce /var/www/mysite/* [email protected]:~/www/mysite 

Это сделало бы его немного ближе к моему использованию команды УПП вы видите.

Однако, когда я управлял этим, я получаю эту ошибку:

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] 

Но если я вернусь к обычной Rsync команды, он работает просто отлично.

Может ли кто-нибудь понять, что я делаю неправильно в моем сценарии Bash?

ответ

7

/var/www/mysite/* расшифровывается оболочкой, поэтому у вас есть много других аргументов, которые вы передаете, чем вы обрабатываете в скрипте.

Также переменные не заменяются в одинарных кавычках, поэтому вам нужно использовать двойные кавычки. (См Баш man page)

Попробуйте это:

#!/bin/bash 
PORT=$1 
shift 
rsync -avzp --progress --rsh="ssh -p$PORT" "[email protected]" 

Сначала мы берем порт из списка аргументов (со сдвигом), то мы используем «$ @», который является особенным, это относится к аргументу (к скрипту в этом случае), и преобразуется во все из них, но каждый отдельно в двойных кавычках. (подробнее см. bash man page).

0

Вы не могли технически превратить это в функции, а также ?:

rscp() { 
rsync -avzp --progress --rsh="ssh -p$PORT" "[email protected]" 
} 

А потом, когда вы запустите его: RSCP 3822

Смежные вопросы