rsync определенные файлы, исключая остальных, игнорируя .svn/каталог, рекурсивно

К сожалению, Linux использует glibc для своей информации о локали, не ICU, таким образом, нет никакого способа непосредственно применить это к Linux, не расходуя большое усилие или модифицируя ICU в glibc или добавляя информацию о локали в glibc.

19
13.12.2017, 01:00
3 ответа

1-я попытка (не работал),

Необходимо включать каталоги в дополнение к файлам:

rsync -zavC --delete --include '*/' --include='*.php' --include='*.js' \
     --exclude="*" /media/datacod/Test/ /home/lucas/Desktop/rsync/

2-я попытка

rsync -avzC --filter='-rs_*/.svn*' --include="*/" --include='*.js' \
     --include='*.php' --exclude="*" --delete dir1/ dir2/

данные тестирования

Я записал этот сценарий для создания некоторых демонстрационных данных для проверения этого на. Вот тот сценарий, setup_svn_sample.bash:

#!/bin/bash

# setup .svn dirs
mkdir -p dir{1,2}/dir{1,2,3,4}/.svn

# fake data under .svn
mkdir -p dir1/dir{1,2,3,4}/.svn/origdir
mkdir -p dir2/dir{1,2,3,4}/.svn/keepdir

# files to not sync
touch dir1/dir{1,2,3,4}/file{1,2}

# files to sync
touch dir1/dir{1,2,3,4}/file1.js
touch dir1/dir{1,2,3,4}/file1.php

Выполнение его производит следующие каталоги:

исходный dir

$ tree -a dir1
dir1
|-- dir1
|   |-- file1
|   |-- file1.js
|   |-- file1.php
|   |-- file2
|   `-- .svn
|       `-- origdir
|-- dir2
|   |-- file1
|   |-- file1.js
|   |-- file1.php
|   |-- file2
|   `-- .svn
|       `-- origdir
|-- dir3
|   |-- file1
|   |-- file1.js
|   |-- file1.php
|   |-- file2
|   `-- .svn
|       `-- origdir
`-- dir4
    |-- file1
    |-- file1.js
    |-- file1.php
    |-- file2
    `-- .svn
        `-- origdir

целевой dir

$ tree -a dir2
dir2
|-- dir1
|   `-- .svn
|       `-- keepdir
|-- dir2
|   `-- .svn
|       `-- keepdir
|-- dir3
|   `-- .svn
|       `-- keepdir
`-- dir4
    `-- .svn
        `-- keepdir

Рабочее вышеупомянутое rsync команда:

rsync -avzC --filter='-rs_*/.svn*' --include="*/" --include='*.js' \
     --include='*.php' --exclude="*" --delete dir1/ dir2/
sending incremental file list
dir1/file1.js
dir1/file1.php
dir2/file1.js
dir2/file1.php
dir3/file1.js
dir3/file1.php
dir4/file1.js
dir4/file1.php

sent 480 bytes  received 168 bytes  1296.00 bytes/sec
total size is 0  speedup is 0.00

Получающийся dir2 afterards:

$ tree -a dir2
dir2
|-- dir1
|   |-- file1.js
|   |-- file1.php
|   `-- .svn
|       `-- keepdir
|-- dir2
|   |-- file1.js
|   |-- file1.php
|   `-- .svn
|       `-- keepdir
|-- dir3
|   |-- file1.js
|   |-- file1.php
|   `-- .svn
|       `-- keepdir
`-- dir4
    |-- file1.js
    |-- file1.php
    `-- .svn
        `-- keepdir

Почему это работает?

Основная часть к этому сценарию должна использовать возможность фильтров rsync. Фильтры позволяют Вам удалять файлы из подобранного набора в различных точках в команде. Таким образом в нашем случае мы фильтруем любые файлы, которые соответствуют шаблону */.svn*. Модификаторы -rs_ скажите фильтру, что мы хотим отфильтровать на обоих исходную сторону, а также целевую сторону.

выборка от раздела FILTER NOTES страницы справочника rsync

  • S используется, чтобы указать, что правило относится к передающей стороне. Когда правило влияет на передающую сторону, оно препятствует тому, чтобы файлы были переданы. Значение по умолчанию для правила влиять на обе стороны если --delete-excluded был указан, в этом случае правила по умолчанию становятся стороной отправителя только. См. также скрытие (H) и покажите (S) правила, которые являются альтернативным способом указать, что сторона отправки включает/исключает.

  • R используется, чтобы указать, что правило относится к стороне получения. Когда правило влияет на сторону получения, оно препятствует тому, чтобы файлы были удалены. Посмотрите s модификатор для большего количества информации. См. также защищение (P) и рискните (R) правилами, которые являются альтернативным способом указать, что сторона получателя включает/исключает.

Посмотрите человека rsync для получения дополнительной информации.

Подсказки для понимания этого (использование подсказки --dry-run)

При описании, как сделать это, я думал, что упомяну --dry-run переключатель к rsync. Это' чрезвычайно полезный в наблюдении, что произойдет, не имея rsync на самом деле произойдите.

Например,

Используя следующую команду сделает тестовый прогон и покажет нам логику решения позади rsync:

rsync --dry-run -avvzC --filter='-rs_*/.svn*' --include="*/" \
     --include='*.js' --include='*.php' --exclude="*" --delete dir1/ dir2/
sending incremental file list
[sender] showing directory dir3 because of pattern */
[sender] showing directory dir2 because of pattern */
[sender] showing directory dir4 because of pattern */
[sender] showing directory dir1 because of pattern */
[sender] hiding file dir1/file1 because of pattern *
[sender] showing file dir1/file1.js because of pattern *.js
[sender] hiding file dir1/file2 because of pattern *
[sender] showing file dir1/file1.php because of pattern *.php
[sender] hiding directory dir1/.svn because of pattern */.svn*
[sender] hiding file dir2/file1 because of pattern *
[sender] showing file dir2/file1.js because of pattern *.js
[sender] hiding file dir2/file2 because of pattern *
[sender] showing file dir2/file1.php because of pattern *.php
[sender] hiding directory dir2/.svn because of pattern */.svn*
[sender] hiding file dir3/file1 because of pattern *
[sender] showing file dir3/file1.js because of pattern *.js
[sender] hiding file dir3/file2 because of pattern *
[sender] showing file dir3/file1.php because of pattern *.php
[sender] hiding directory dir3/.svn because of pattern */.svn*
[sender] hiding file dir4/file1 because of pattern *
[sender] showing file dir4/file1.js because of pattern *.js
[sender] hiding file dir4/file2 because of pattern *
[sender] showing file dir4/file1.php because of pattern *.php
[sender] hiding directory dir4/.svn because of pattern */.svn*
delta-transmission disabled for local transfer or --whole-file
[generator] risking directory dir3 because of pattern */
[generator] risking directory dir2 because of pattern */
[generator] risking directory dir4 because of pattern */
[generator] risking directory dir1 because of pattern */
[generator] protecting directory dir1/.svn because of pattern */.svn*
dir1/file1.js
dir1/file1.php
[generator] protecting directory dir2/.svn because of pattern */.svn*
dir2/file1.js
dir2/file1.php
[generator] protecting directory dir3/.svn because of pattern */.svn*
dir3/file1.js
dir3/file1.php
[generator] protecting directory dir4/.svn because of pattern */.svn*
dir4/file1.js
dir4/file1.php
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 231 bytes  received 55 bytes  572.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

В вышеупомянутом выводе Вы видите что ./svn каталоги защищаются нашим правилом фильтра. Ценное понимание для отладки rsync.

Ссылки

13
27.01.2020, 19:45
  • 1
    Уже попробованный это, как я сказал выше. Если я делаю это, то.SVN каталог также включен (скорее всего, удаленный, потому что Он не существует в источнике, или измененный). Очень важно оставить.SVN каталог нетронутым. Спасибо за попытку так или иначе! :) –  canolucas 17.05.2013, 23:04
  • 2
    C, как предполагается, игнорирует ".SVN /", но include="*/" включает его –  canolucas 17.05.2013, 23:07
  • 3
    Вы правы. Это должно быть .svn, редактирование ответа. Так или иначе, после переименования проблемы остается. -C и include="*/" кажется, не очень близкие друзья :( –  canolucas 17.05.2013, 23:27

Хорошо, после нескольких попыток я отсортировал это:

rsync -vaiz --delete --exclude=.svn/ --include='*.php' --include='*.js' \
    --include='*/' --exclude='*' --prune-empty-dirs \
    --filter "protect .svn/" /origin /destination

Спасибо

10
27.01.2020, 19:45
  • 1
    Большой ответ. Мой фильтр защищает .svn/ директора от --prune-empty-dirs в случае они пусты. Другой подход, эти копирующие пустые директора: rsync -vaiz --delete --exclude=.svn/ --include='*.php' --include='*.js' --include='*/' --exclude='*' /origin /destination –  canolucas 18.05.2013, 03:22
  • 2
    Ключ моего подхода к --exclude=.svn/ перед --include –  canolucas 18.05.2013, 03:23
  • 3
    Хороший ответ также. Я предложил бы исключение = '.svn /' но я думал, что Вы хотели использовать -C. Довольный Вы поняли это! –  slm♦ 18.05.2013, 04:32

Хотя при этом не используется rsync, другим вариантом является использование find и cpio. Например, у меня есть каталог с названием «Фотографии», в котором указаны год и месяц.

Photos
├── 2002
│   ├── 2002-03
│   │   ├── 2002-03-30
│   │   ├── 2002-03-31
│   │   └── 2002-03-31-02
│   ├── 2002-04
│   │   ├── 2002-04-01
│   │   ├── 2002-04-01-03
│   │   ├── 2002-04-07
│   │   ├── 2002-04-21
│   │   ├── 2002-04-22
│   │   ├── 2002-04-22-02
│   │   └── 2002-04-27
│   ├── 2002-05
│   │   ├── 2002-05-02
│   │   ├── 2002-05-03

Но здесь у меня есть jpg, dng, xml и другие вещи, и я хочу только jpg, поэтому я бы сделал это

"cd" в каталог над каталогом Photos, затем:

find Photos -type f -name "*jpg" -print | cpio -pdmvu /fast

И понеслось

/fast/Photos/2002/2002-04/2002-04-22/bath problem.jpg
/fast/Photos/2002/2002-04/2002-04-22-02/full bath.jpg
/fast/Photos/2002/2002-07/2002-07-10/Broken Top.jpg
/fast/Photos/2002/2002-12/2002-12-28/101-0125_IM~~G.jpg
/fast/Photos/2002/2002-12/2002-12-28/small-101-0125_IM~~G.jpg
/fast/Photos/2003/2003-01/2003-01-19/k1.jpg
/fast/Photos/2003/2003-01/2003-01-19/k2.jpg
/fast/Photos/2003/2003-02/2003-02-23/quinn.jpg
/fast/Photos/2003/2003-05/2003-05-04/all.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0015_r1.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0006_2_r1.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0006_r1.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0007_2_r1.jpg

Вы можете использовать этот метод для многих вещей, много лет назад мы копировали файловую систему / при перемещении на большие диски, поскольку это копировало файлы устройства.

0
27.01.2020, 19:45

Теги

Похожие вопросы