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
Запуск его производит следующие каталоги:
исходный каталог
$ 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
пункт назначения
$ 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 после этого:
$ 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_
сообщают фильтру, что мы хотим фильтровать как на стороне источника, так и на стороне цели.
выдержка из раздела «ЗАМЕЧАНИЯ ФИЛЬТРА» на справочной странице rsync
S используется для указания того, что правило применяется к передающей стороне. Когда правило влияет на отправляющую сторону, оно предотвращает передачу файлов. По умолчанию правило влияет на обе стороны, если
--delete-excluded
не указано иное, в этом случае правила по умолчанию становятся только на стороне отправителя. См. Также правила скрытия (H) и показа (S), которые являются альтернативным способом указания включений / исключений на стороне отправителя.
Г используется для указания того, что правило применяется к принимающей стороне. Когда правило влияет на принимающую сторону, оно предотвращает удаление файлов. Смотрите модификатор s для получения дополнительной информации. См. Также правила защиты (P) и риска (R), которые являются альтернативным способом указания включений / исключений на стороне получателя.
Смотрите man 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
.
Ссылки
include="*/"
включает его.svn
, редактирование ответа. Во всяком случае, после переименования проблема остается.-C
иinclude="*/"
, кажется, не очень близкие друзья :(Хорошо, после нескольких попыток я разобрался с этим:
Спасибо
источник
.svn/
каталоги--prune-empty-dirs
в том случае, если они пусты. Другой подход, это дублирование пустыхrsync -vaiz --delete --exclude=.svn/ --include='*.php' --include='*.js' --include='*/' --exclude='*' /origin /destination
--exclude=.svn/
до того , как--include
«S-C
. Рад, что вы поняли это!Хотя это не использует rsync, другой вариант - использовать find и cpio. Например, у меня есть каталог под названием «Фото» и это год и месяц.
Но здесь у меня есть JPG, DNG, XML и другие вещи, и я хочу только JPG, поэтому я бы сделал это
"cd" в каталог над каталогом Photos затем:
И пошло-поехало
Вы можете использовать этот метод для многих вещей, несколько лет назад мы копировали файловую систему / при перемещении на большие диски, как если бы она копировала файлы устройств.
источник