Ошибка при попытке упростить команду rsync - PullRequest
2 голосов
/ 16 ноября 2008

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

#!/bin/bash

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

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

rscp 3822 --exclude=tiny_mce /var/www/mysite/* root@webhost.com:~/www/mysite

Это бы немного приблизило меня к использованию команды scp, видите ли.

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

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?

Ответы [ 2 ]

7 голосов
/ 16 ноября 2008

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

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

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

#!/bin/bash
PORT=$1
shift
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"

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

0 голосов
/ 24 декабря 2016

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

    rscp() {
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"
}

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

...