rsync виключити каталог не працює


34

Я запускаю Fedora 17 64-розрядний і rsync --exclude=/home/ben/<dir>не працює так, як очікувалося.

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

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/

Однак вміст із ~/buildта ~/.ccacheкопіюється rsync. Що я роблю неправильно?


1
Я думаю, що виключення моделей просто не працює.
Sören

Відповіді:


37

rsyncПравила глобального фільтра, що починаються з провідних /, прив’язані до кореня передачі. Цитуючи з розділу "ВКЛЮЧИТИ / ВИКЛЮЧВАЙТЕ ПРАВИЛА ПАТЕРНУ" на сторінці "man":

якщо шаблон починається з a /, то він прив’язаний до певного місця в ієрархії файлів, інакше він буде зіставлений проти кінця імені шляху. Це схоже на провідний ^ у регулярних виразах. Таким чином, "/ foo" буде відповідати імені "foo" або в "корені передачі" (для глобального правила), або в каталозі файлів об'єднання (для правила для каталогу).

У вашій команді ( rsync ... -arv /home/ben home-ben/) файл /home/ben/fooбуде передано до home-ben/ben/foo. Корінь передачі є, home-benі правильний шлях фільтра є /ben/foo. Таким чином,

  • щоб відповідати /home/ben/.ccacheвам потрібен шлях фільтра/ben/.ccache
  • щоб відповідати /home/ben/build/вам потрібен шлях фільтра/ben/build/

Більш детальне пояснення можна знайти в розділі "АНКОРУВАННЯ ВКЛЮЧИТИ / ВИКЛЮЧУВАТИ ПАРТНЕРИ" на головній rsync(1)сторінці .


Зауважте, що просто відмовлятися від ведучих /- це не обов'язково те, чого ви хочете. Цитую ще раз із того ж розділу чоловічої сторінки:

Некваліфікований "foo" відповідатиме назві "foo" в будь-якій точці дерева, оскільки алгоритм застосовується рекурсивно зверху вниз; він поводиться так, ніби кожен компонент контуру отримує поворот, будучи кінцем імені файлу. Навіть неприв’язаний "sub / foo" відповідав би будь-якій точці ієрархії, де в каталозі під назвою "sub" було знайдено "foo". Дивіться розділ "АНКОРУВАННЯ ВКЛЮЧЕННЯ / ВИКЛЮЧЕННЯ ПАТЕРНЕТІВ" для повного обговорення того, як вказати шаблон, що відповідає корені передачі.

Таким чином, фільтр-шаблон build/буде відповідати каталогу побудови в будь-якому місці /home/ben, навіть /home/ben/many/sub/directories/build/.


2
Основна деталь полягає в тому, що косоокість має значення. Якщо ви додасте косу рису в кінець вихідного каталогу (rsync-джерело / адресат), він скопіює вміст джерела, інакше rsync -a source destinationкопіює сам джерельний каталог до місця призначення. Це визначає, яким буде корінь передачі, щоб повідомити вираз виключення. Правильне використання / у виразі виключення пояснюється вище. Зокрема, зверніть увагу, що rsync --exclude='/dir1' source destinationнічого не виключає.
pgoetz

11

Я думаю, ваші excludeшляхи повинні бути відносними до вихідного шляху. Чи можете ви спробувати це замість цього?

rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/

Ось тест для порівняння:

/tmp$ tree src dest
src
├── a
└── b
dest
└── foo/

/tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest
sending incremental file list
src/
src/a
src/b

$ rsync -nav --exclude b /tmp/src /tmp/dest
sending incremental file list
src/
src/a

2
Ця відповідь неправильна. При відносному шляху виключення ви викреслюєте візерунок скрізь!
rubo77

Ця публікація правильна. Відповідність є текстовою, а не файловою на inode. Який би шлях не --verboseпоказав результат команди, це формат, який ви повинні використовувати.
Шрідхар Сарнобат

Це працювало для мене.
Женю

Що робити, якщо вихідний шлях дорівнює "/", то абсолютними є відносні шляхи, але він все ще не працює.
Сьорен

Це єдине, що працювало на мене.
Джонатан

2

Я мав цю проблему в сценарії (не знаю, чи це у вас). Я був тому, що я використовував цю команду в сценарії, і я використовував sh замість bash. перевірте шебанг на початку вашого сценарію.


1

Ваш шаблон виключення буде спрацьовувати, якщо ви rsync весь / домашній шлях, тобто без кінцевої косої риски:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/

Але краще лише rsync вміст папки з косою косою рисою:

rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/

Ви також можете використовувати список ігнорування, див. Https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders


0

Для того, щоб виключити папку specif з rsync, вам потрібно врахувати відносний шлях у команді. у вашому випадку:

rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/

де "ben" - папка, яку ви синхронізуєте

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.