Подтвердить что ты не робот

Rsync исключает каталог, но включает в себя подкаталог

Я пытаюсь скопировать проект на свой сервер с помощью rsync. У меня есть сценарии установки для конкретных проектов в подкаталоге

Проект/спецификации/установить/project1

То, что я пытаюсь сделать, это исключить все из каталога project/specs, но каталог установки для проекта: project/specs/install/project1.

rsync -avz --delete --include=specs/install/project1 \
    --exclude=specs/* /srv/http/projects/project/ \
     [email protected]:~/projects/project

Но так же содержимое каталога спецификаций исключается, но каталог install/project1 не включается.

Я пробовал все, но я просто не понимаю, как это работает.

4b9b3361

Ответ 1

Когда-то это просто деталь.

Просто измените свой шаблон включения, добавив трейлинг/в конец шаблона include, и он будет работать:

rsync -avz --delete --include=specs/install/project1/ \
    --exclude=specs/* /srv/http/projects/project/ \
    [email protected]:~/projects/project

Или, альтернативно, подготовьте файл фильтра следующим образом:

$ cat << EOF >pattern.txt
> + specs/install/project1/
> - specs/*
> EOF

Затем используйте параметр -filter:

rsync -avz --delete --filter=". pattern.txt" \
    /srv/http/projects/project/ \
    [email protected]:~/projects/project

Для получения дополнительной информации перейдите в раздел "ПРАВИЛА ФИЛЬТРА" на странице руководства rsync (1).

Ответ 2

Другое решение здесь не работает.


Надежный способ

У вас нет выбора, кроме как вручную спускаться для каждого уровня вашего подкаталога. Нет риска включать нежелательные файлы, так как rsync не включает файлы включенных каталогов.

1) Создайте файл фильтра include, например, include_filter.txt:

+ /specs/
+ /specs/install/
+ /specs/install/project1/***
- /specs/**

2) Запустите его:

rsync -avz --delete --include-from=include_filter.txt \
    /srv/http/projects/project/ \
    [email protected]:~/projects/project
  • Не забывайте начальную косую черту "/", иначе вы можете сопоставить подкаталоги с именем "**/specs/install/project1/".
  • Выбирая фильтр типа include (--include-from = FILE), стартовые плюс + знаки являются необязательными, так как это действие по умолчанию без знака. (Вы можете иметь противоположное значение "-" по умолчанию с --exclude-from = FILE.)
  • Двойные звезды "**" означают "любой путь"
  • Три звезды "***" означают "любой путь, включая этот самый каталог"

Простой способ

Вы можете запускать свои фильтры "*/", позволяя rsync опускаться на все ваши под-уровни. Это удобно, но:

  • Все каталоги будут включены, хотя и пустые. Это можно исправить с помощью опции rysnc -m, но тогда все пустые директории будут пропущены.

1) Создайте файл фильтра include, например, include_filter.txt:

+ /**/
+ /specs/install/project1/***
- /specs/**

2) Запустите его:

rsync -avzm --delete --include-from=include_filter.txt \
    /srv/http/projects/project/ \
    [email protected]:~/projects/project

Обратите внимание на добавленную опцию -m.