Pierwsza próba (nie zadziałała)
Oprócz plików należy dołączyć katalogi:
rsync -zavC --delete --include '*/' --include='*.php' --include='*.js' \
--exclude="*" /media/datacod/Test/ /home/lucas/Desktop/rsync/
2. próba
rsync -avzC --filter='-rs_*/.svn*' --include="*/" --include='*.js' \
--include='*.php' --exclude="*" --delete dir1/ dir2/
dane testowe
Napisałem ten skrypt, aby utworzyć przykładowe dane do przetestowania. Oto ten skrypt 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
Uruchomienie go powoduje utworzenie następujących katalogów:
źródło reż
$ 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
miejsce docelowe reż
$ tree -a dir2
dir2
|-- dir1
| `-- .svn
| `-- keepdir
|-- dir2
| `-- .svn
| `-- keepdir
|-- dir3
| `-- .svn
| `-- keepdir
`-- dir4
`-- .svn
`-- keepdir
Uruchomienie powyższego rsync
polecenia:
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
Wynikające z 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
Dlaczego to działa?
Kluczowym elementem tego skryptu jest wykorzystanie możliwości filtrów rsync
. Filtry pozwalają usuwać pliki z dopasowanego zestawu w różnych punktach polecenia. W naszym przypadku filtrujemy wszystkie pliki pasujące do wzorca */.svn*
. Modyfikatory -rs_
mówią filtrowi, że chcemy filtrować zarówno po stronie źródłowej, jak i docelowej.
fragment sekcji UWAGI FILTRUJĄCE strony man rsync
S służy do wskazania, że zasada ta ma zastosowanie do strony wysyłającej. Gdy reguła wpływa na stronę wysyłającą, zapobiega przesyłaniu plików. Domyślnie reguła ma wpływ na obie strony, chyba że --delete-excluded
określono inaczej
, w takim przypadku reguły domyślne stają się tylko po stronie nadawcy. Zobacz także reguły ukryj (H) i pokaż (S), które są alternatywnym sposobem określania włączeń / wykluczeń po stronie wysyłającej.
R służy do wskazania, że zasada ta ma zastosowanie do części odbiorczej. Gdy reguła wpływa na stronę odbierającą, zapobiega usuwaniu plików. Zobacz modyfikator s, aby uzyskać więcej informacji. Zobacz także zasady ochrony (P) i ryzyka (R), które są alternatywnym sposobem określania włączeń / wyłączeń po stronie odbiornika.
Zobacz man rsync po więcej szczegółów.
Wskazówki, jak to rozwiązać (przy użyciu podpowiedzi --dry-run
)
Opisując, jak to zrobić, pomyślałem, że wspomnę o --dry-run
zmianie na rsync
. Jest to bardzo przydatne, gdy zobaczysz, co się stanie, bez rsync
faktycznego zajścia.
Na przykład
Użycie następującego polecenia spowoduje uruchomienie testowe i pokazanie logiki decyzyjnej 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)
Na powyższym wyjściu widać, że ./svn
katalogi są chronione przez naszą regułę filtrowania. Cenny wgląd w debugowanie rsync
.
Bibliografia