2

Мне нужно передать файлы через SSH на другой сервер. Файловые структуры идентичны с обеих сторон. Я использовал scp -r, но это не сохраняет оригинальные права доступа к файлу / директории. rsync поддерживает тактичность разрешений, но не удаляет файлы на стороне назначения, если я хочу перезаписать их из-за изменений. Я знаю, что rsync запишет изменения, когда исходные файлы будут более новыми, но мне нужно просто скопировать все, независимо от даты (то есть заменить каталог назначения на тот, который я перемещаю), без необходимости сначала входить в папку назначения и вручную удалять каталог. ,

Я слышал, что tar может сделать это, но я не могу заставить его работать без ошибок. Синтаксис

tar -cf - /directory/directory | ssh host.name tar -xf - C /destination_directory

Любая помощь будет оценена.

2 ответа2

2

rsync может удалять файлы в месте назначения, используя синтаксис --delete. Если вы хотите, чтобы файл полностью перезаписывался по сравнению с реализацией частичной синхронизации, попробуйте --whole-file.

Выдержки из http://www.samba.org/ftp/rsync/rsync.html:

-W, --whole-file С этой опцией алгоритм дельта-передачи rsync не используется, и весь файл отправляется как есть. Передача может быть быстрее, если этот параметр используется, когда полоса пропускания между исходным и целевым компьютерами выше, чем полоса пропускания на диск (особенно, когда "диск" фактически является сетевой файловой системой). Это значение по умолчанию, когда и источник, и адресат указываются как локальные пути, но только если не действует опция пакетной записи.

--delete Это говорит rsync об удалении посторонних файлов с принимающей стороны (тех, которые не на отправляющей стороне), но только для каталогов, которые синхронизируются. Вы, должно быть, попросили rsync отправить весь каталог (например, "dir" или «dir /») без использования подстановочного знака для содержимого каталога (например, «dir /*»), поскольку подстановочный знак раскрывается оболочкой, и, таким образом, rsync получает запрос на передачу отдельных файлов, а не родительский каталог файлов. Файлы, которые исключены из передачи, также исключаются из удаления, если вы не используете опцию --delete-exclude или не помечаете правила как совпадающие только на отправляющей стороне (см. Модификаторы include /exclude в разделе ПРАВИЛА ФИЛЬТРА).

0

Как отметил Эдди, rsync --delete -Ha сделает всю работу за вас. Убедитесь, что вы используете параметр --dry-run/-n перед тем, как запускать его, чтобы избежать случайного удаления всего содержимого в неправильном каталоге. Rsync по-разному интерпретирует ваши каталоги в зависимости от того, добавляете ли вы косую черту (см. man rsync и ищите "trailing"), поэтому легко ошибиться, если вы не обращаете внимания.

Я также иногда использую tar, как вы делаете. Я думаю, что вы просто пропустите черту перед буквой C в вашей команде выше. Как правило, вы можете пропустить только тире в первом параметре. (Но вы также можете использовать cd вместо неуклюжего синтаксиса -C .) Имея tar на исходной стороне, вы создаете дополнительный ведущий directory/ в именах путей в вашем архиве, поэтому я бы сначала указал cd на исходной стороне. Кстати, -f - это избыточно (по умолчанию tar использует stdin/stdout). Итак, вот как выглядят мои водопроводные гудроны:

cd /some/dir; tar c my_dir | ssh host 'cd /the/target/dir; rm -rf my_dir; tar x'

Используйте sudo tar на стороне хоста, чтобы сохранить владение при извлечении. (Совет: используйте cz/xz вместо c/x для передачи по протоколу gzip или передайте через lzop и lzop -d для сжатия в реальном времени, если вы передаете по кабелю Ethernet.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .