rsync копирует содержимое каталога не рекурсивно

8

Я пытаюсь без рекурсивного копирования содержимого ряда каталогов в другую удаленную систему.

/dirA/dir1/file
/dirA/dir2/file
/dirA/dir3/file

dir1, dir2 и dir3 содержат много каталогов, которые я не хочу копировать. Скопируйте на удаленном хосте в / dirB, сохраняя ту же структуру каталогов.

Я старался:

rsync /dirA/*/ host:/dirB/
rsync /dirA/   host:/dirB/

Но они не делают то, что я хочу.

Фелипе Альварес
источник

Ответы:

20

rsync позволяет вам определять шаблоны, которые запускают включение или исключение файлов и каталогов. Я думаю, что вы хотите использовать что-то вроде этого:

rsync -a -f '- /*/*/' /dirA/ host:/dirB/

Объяснение:

  • -aзапускает режим архивирования, который активирует как рекурсию, так и сохранение «символических ссылок, устройств, атрибутов, разрешений, владельцев и т. д.», в соответствии с man rsync.
  • -fэто сокращение от --filter=, которое добавляет правило фильтрации файлов.
    • Шаблон находится внутри одинарных кавычек, поэтому оболочка не расширяет подстановочные знаки; двойные кавычки работали бы одинаково хорошо в этом случае.
    • - означает, что это шаблон исключения.
    • Ведущий /означает, что шаблон должен начинаться с dirA/(rsync "Transfer-root").
    • */*Часть рисунка относится ни к чему внутри поддиректории.
    • Трейлинг /ограничивает исключение каталогами. Файлы внутри подкаталога dirA/не затрагиваются.

Таким образом, в конце концов, rsync копирует только один уровень вниз (а также не создает каталоги второго уровня).

PleaseStand
источник
2
Очень хорошо! Я был в состоянии использовать -f '- /*/'для ограничения только файлы верхнего уровня. Мне также пришлось указать, -f '- .*'чтобы исключить точечные файлы, так как я синхронизировал домашний каталог.
haridsv
5

Решение выше (от PleaseStand) не работает для меня по некоторым причинам. Это сработало, хотя:

rsync -avc --no-r ./source/* ./destination/

Есть также этот альтернативный вариант:

rsync -avc --exclude "/" ./source/ ./destination/

Андрей Покровский
источник
1

Одна из «особенностей» rsync - это то, как анализируются каталоги.

rsync /dirA/ host:/dirB/ и rsync /dirA host:/dirB должен быть теоретически эквивалентным.

Как не желая поощрять рекурсивность, вы хотите избежать -r, -aчто в дополнение к другим вещам подразумевает -r.

Я еще не совсем закончил исследование, но это мой начальный ответ.

killermist
источник