Следующее является надрезом вывода от bash -vx
на моем резервном сценарии
\+ rsync '' -avushi --stats --progress --log-file=/home/bigbird/temp/rlog/rlog1.txt /media/dataspace/data/webcasts/ /media/work/data/webcasts
отправка возрастающего списка файлов
Я делал rsync
s как это навсегда и я просто видел эту проблему в прошлом месяце или два. Этот работает на Kubuntu Oneiric, но я думаю, что, возможно, видел его на Kubuntu Lucid также.
Скрипт запускается от /home/bigbird/bin
Это работает отлично за исключением того, что это дополнительно передает все файлы от моего текущего каталога до места назначения. У меня также есть секунда rsync
позже в сценарии, который делает то же самое к другому каталогу.
Я просто выполнил его снова из другого каталога, и это скопировало все те файлы вместо этого.
Я не вижу a "."
в источнике где угодно и т.д.
Я сделал a set | less
Посмотревший все мой ~/bin
файлы
Посмотревший все мои псевдонимы
У меня нет подсказки относительно того, что вызвало бы это.
Где я ищу проблему?
Первоначальный код был
DRYRUN="-n"
DRYRUN=""
...
rsync "${DRYRUN}" -avushi --stats --progress --log-file="${LOGFILE}"
/media/dataspace/data/webcasts/ "${MOUNT}${DESTDIR}"
Рабочий код:
DRYRUN=1 ## for testing rsync without any file transfers
DRYRUN=0 ## for live run
...
if (( ${DRYRUN} ))
then
rsync -n -avushi --stats --progress --log-file="${LOGFILE2}" /media/dataspace"${DESTDIR2}"/ "${MOUNT}${DESTDIR2}"
else
rsync -avushi --stats --progress --log-file="${LOGFILE2}" /media/dataspace"${DESTDIR2}"/ "${MOUNT}${DESTDIR2}"
fi
«Мы встретили врага, а он - мы!» - Уолт Келли (комиксы Pogo)
Я нашел это! Невидимый не значит, что его там нет.
Я не совсем понимаю, что произошло, но, поместив "$ {DRYRUN}" в командную строку rsync, он сделал первый аргумент rsync "". Видимо, это интерпретировалось как PWD, а не как ошибка. Таким образом, команда была перенесена "" и мой реальный источник в мое реальное место назначения, потому что rsync принимает несколько источников.
Остается вопрос: почему rsync считает, что «» означает текущий каталог, а не интерпретирует его как синтаксическую ошибку?
Ваш случай настолько прост, что вы можете просто удалить кавычки вокруг переменной:
rsync $DRYRUN -avushi --stats --progress --log-file="${LOGFILE2}" /media/dataspace"${DESTDIR2}"/ "${MOUNT}${DESTDIR2}"
Но вам может понадобиться кавычки в другом случае, например, если параметр представляет собой путь, содержащий пробелы, которые может или не может быть определено. Итак, вот более элегантное решение:
linkdest="<OLD_BACKUP_PATH>"
rsync ${linkdest:+--linkdest="$linkdest"} -avushi --stats --progress --log-file="${LOGFILE2}" /media/dataspace"${DESTDIR2}"/ "${MOUNT}${DESTDIR2}"
Если $ linkdest пусто, ничего не будет вставлено. Если $ linkdest не является пустым, будет вставлено --linkdest = "$ linkdest" (и оно будет оцениваться как команда, а не как строка).