8

У меня есть каталог с исходным кодом, который выглядит следующим образом (с многочисленными подкаталогами внутри директорий src и bin):

  • top_dir
    • proj1
      • SRC /
      • бен /
      • скрипты /
      • somefile.txt
    • proj2
      • SRC /
      • бен /
      • цель
        • бен /
      • file.xml

Я хотел бы rsync только каталоги bin непосредственно под каталогами проекта (то есть игнорировать top_dir/proj2/target/bin/) и их содержимое в каталог назначения, чтобы это выглядело так:

  • top_dir
    • proj1
      • бункер
    • proj2
      • бункер

Возможно, я мог бы заставить его работать, явно перечислив каждый каталог bin (в моем реальном сценарии их около 15) в файле include-from, но я подумал, что должен быть способ сказать, что я хочу синхронизировать все top_dir/*/bin каталоги.

2 ответа2

10

Возможность 1

Не используя правила фильтрации rsync, но расширение оболочки * вы можете сделать:

а. Чтобы включить все каталоги bin в иерархию top_dir :

rsync -av -R top_dir/**/bin/ destination_path

Здесь -R - параметр rsync, обозначающий относительный и означающий, что структура каталогов сохраняется.

** - это шаблон оболочки, который рекурсивно ищет каталоги с именем bin в top_dir . Итак, в приведенном выше примере командная строка расширяется до:

rsync -av -R top_dir/proj1/bin/ top_dir/proj2/bin/ destination_path

б. Если вы хотите включить каталог bin один уровень ниже каталога проекта, просто используйте один * (который также работает с "древними" оболочками!):

rsync -av -R top_dir/*/bin/ destination_path

* Вам нужна последняя версия bash (> 4) и активировать рекурсивное сглаживание с помощью shopts -s globstar . С zsh рекурсивное сглаживание используется по умолчанию.

Возможность 2

Вам нужны только правила фильтрации rsync:

а. Чтобы включить все каталоги bin в иерархию top_dir :

rsync -av -m --include='**/' --include='**/bin/**' --exclude='*' top_dir/ destination_path

Первое правило включения может быть неочевидным +, но гарантирует, что во всех каталогах (обратите внимание на конечный символ /) выполняется поиск, второе наконец добавляет все в каталоги bin а правило исключения исключает все остальное. -m удостоверяется, что пустые каталоги не копируются.

б. Только один уровень ниже директории проекта:

rsync -av -m  --include='/*/' --include='/*/bin/***' --exclude='*' top_dir/ destination_path

Используя *** синтаксис rsync> = 2.6.7. Начальные / в шаблонах представляют top_dir , в противном случае шаблоны сопоставляются с концом пути к файлу.


+ Искать в / rsync /some/path/this-file-will-not-be-found в man rsync

0

Вы можете исключить все каталоги src используя --exclude src/

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