it-swarm.xyz

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

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

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

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

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

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

Я попробовал все, но я просто не могу заставить это работать

22
user1036651

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

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

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).

32
spider

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


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

У вас нет выбора, кроме как вручную опуститься для каждого уровня вашего подкаталога. Нет риска включать ненужные файлы, так как 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/ \
    [email protected]:~/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/ \
    [email protected]:~/projects/project

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

8
lodc

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

0
Akif