Я пытаюсь выполнить резервное копирование некоторых данных с сервера, на котором работает старая версия rsync - по разным причинам я не могу просто обновить программное обеспечение.
Обычно я использую --files-from и предоставляю список файлов и каталогов для резервного копирования, но эта версия rsync не имеет этого переключателя. Есть ли способ с другими переключателями, чтобы старый rsync вел себя так же?
Я пробовал комбинацию --include-from = --exclude = *, но она выглядит недостаточно рекурсивной (например, / etc / * создает резервные копии только непосредственно под / etc).
Я подозреваю, что xargs - ваш друг в этом случае.
Полностью непроверено:
# cat file | xargs -IREPLACE rsync -v REPLACE server:/path
xargs будет брать данные из stdin и добавлять их в командную строку по одному параметру на строку ввода до тех пор, пока он не заполнит длину командной строки, а затем запускает отдельную команду, пока все строки ввода не будут использованы. Это будет означать, что rsync вполне может запускаться более одного раза. В данном случае это не должно быть проблемой, но может быть с другими командами.
Обычно xargs просто помещает аргументы в конец строки, но с rsync вы хотите, чтобы адресат оставался последним, поэтому мы используем параметр -I, чтобы заменить строку аргументами. (Это непроверенный бит). Я также немного не уверен, что rsync будет делать с путями, поэтому, пожалуйста, внимательно проверьте это, прежде чем использовать его в гневе.
Если у вас есть проблема с xargs, вы можете использовать что-то вроде:
for i in $(cat file); do rsync -v $i server:/path; done
Если ваш файл больше, вы, вероятно, захотите вместо этого использовать цикл while / read. Это будет намного медленнее, поскольку будет обрабатывать один файл за раз.
Если ваши include / excludes не повторяются, возможно, вы не указали -r
? Если вы привыкли использовать --files-from
тогда вы могли бы избавиться от этой привычки.
Кроме того, может помочь указание точной команды, которую вы используете. include-from
/exclude-from
определенно рекурсивно хорошо для меня.
Глупое решение, не лишенное смысла, которое мне приходилось использовать раньше на некоторых серверах, когда один только rsync не хочет размещать хорошее. Используйте tar для захвата только тех файлов, которые вам нужны:
cat INCLUDES
/home/user/index.htm
/home/user/robots.txt
tar cf INCLUDES.tar INCLUDES
for file in `cat INCLUDES`; do tar -r --file=INCLUDES.tar $file; done
rsync -avzP INCLUDES.tar user@remoteHost.com:./remote_path
--- Now on remote server
mkdir INCLUDES
tar xf INCLUDES.tar -C ./INCLUDES
rsync -avzP INCLUDES/home/user/ /home/user/