Помогите Сценарию оболочки передать переменные rsync

Согласно этой записи в блоге, можно использовать upstart в Debian, нестабильном (=sid).

Хрипящий Debian (в настоящее время тестирование, надо надеяться, скоро стабильное), содержит все еще старую версию выскочки и мог поэтому иметь старые проблемы.

5
18.01.2014, 04:28
3 ответа

Проблема состоит в том, что необходимо заключить имена файлов в кавычки, но Вы не можете сделать всего этого использования строки, потому что оно передаст все имена файлов до rsync как одна длинная строка с кавычками в строке (и не отдельные строковые параметры файла).

Переменный $ является массивом в Bash. Необходимо преобразовать его в новый массив при отправке к rsync.

LOCATION="/media/WD100/"
all_files=()
for file in "$@"; do
    all_files+=(":\"$LOCATION$file\"")
done
rsync --progress --inplace --append-verify -ave ssh username@homeserver"${all_files[@]}" .
1
27.01.2020, 20:38

Использование:

# prepend "$location" to each element of the `"$@"` array:
for file do
  set -- "$@" "$location/$file"
  shift
done

rsync ... -0 --files-from=<(printf '%s\0' "$@") user@host: .

Или:

rsync ... -0 --files-from=<(
  for file do
    printf '%s\0' "$location/$file"
  done) user@host: .

быть на безопасной стороне.

Это передает список файлов как NUL разграниченный список через именованный канал к rsync.

5
27.01.2020, 20:38
  • 1
    Спасибо за Вашу справку Chazelas. Я пытался реализовать Ваше решение, но без успеха. Я обновил OP для объяснения. –  Sepero 18.01.2014, 02:27
  • 2
    @Sepero, это "$@" массив это предназначено, чтобы быть переданным printf здесь, посмотрите мое редактирование, если Вы хотите предварительно ожидать что-то к каждому элементу того массива. спасибо –  Stéphane Chazelas 18.01.2014, 10:07

Так как Вы копируете все содержание WD100 к текущему местоположению, просто позвольте rsync синхронизировать содержание каталога.

rsync --progress --inplace --append-verify -ave ssh username@homeserver:/media/WD100/ ./

rsync ведет себя по-другому в зависимости от запаздывающей наклонной черты в пути. Если нет никакой наклонной черты, это копирует объект каталога рекурсивно, но если существует наклонная черта, это скопирует содержание каталога рекурсивно.

Вот раздел rsync руководства, которое является подходящим.

Запаздывающая наклонная черта на источнике изменяет это поведение, чтобы не создавать дополнительный уровень каталога в месте назначения. Можно думать о запаздывании / на источнике как значение lqcopy содержание этого directoryrq в противоположность lqcopy каталог namerq, но в обоих случаях атрибуты содержания каталога передаются содержанию каталога на месте назначения. Другими словами, каждая из следующих команд копирует файлы таким же образом, включая их установку атрибутов/dest/foo:

rsync -av /src/foo /dest
rsync -av /src/foo/ /dest/foo
0
27.01.2020, 20:38
  • 1
    я думаю, существует недоразумение. Я "не копирую все содержание WD100". Переменный $all_files представляет все имена файлов, переданные сценарию оболочки, не все файлы в WD100. –  Sepero 20.01.2014, 14:13

Теги

Похожие вопросы