rsync исключает каталог, но включает подкаталог - PullRequest
23 голосов
/ 25 ноября 2011

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

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

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

rsync -avz --delete --include=specs/install/project1 \
    --exclude=specs/* /srv/http/projects/project/ \
     user@server.com:~/projects/project

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

Я перепробовал все, но, похоже, это не сработало

Ответы [ 3 ]

34 голосов
/ 25 ноября 2011

Иногда это просто деталь.

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

rsync -avz --delete --include=specs/install/project1/ \
    --exclude=specs/* /srv/http/projects/project/ \
    user@server.com:~/projects/project

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

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

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

rsync -avz --delete --filter=". pattern.txt" \
    /srv/http/projects/project/ \
    user@server.com:~/projects/project

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

8 голосов
/ 14 мая 2016

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


Надежный путь

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

1) Создайте файл фильтра включения, например, «include_filter.txt»:

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

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

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

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

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

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

1) Создайте файл фильтра включения, например, «include_filter.txt»:

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

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

rsync -avzm --delete --include-from=include_filter.txt \
    /srv/http/projects/project/ \
    user@server.com:~/projects/project

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

0 голосов
/ 29 октября 2018

Порядок --include и --exclude влияет на то, что включено или исключено.
Когда есть конкретные подкаталоги, которые нужно включить, нужно сначала разместить их.
Подобный пост доступен здесь .

...