1ª tentativa (não funcionou)
Você precisa incluir os diretórios além dos arquivos:
rsync -zavC --delete --include '*/' --include='*.php' --include='*.js' \
--exclude="*" /media/datacod/Test/ /home/lucas/Desktop/rsync/
2ª tentativa
rsync -avzC --filter='-rs_*/.svn*' --include="*/" --include='*.js' \
--include='*.php' --exclude="*" --delete dir1/ dir2/
dados de teste
Eu escrevi este script para criar alguns dados de amostra para testar isso. Aqui está o script 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
A execução produz os seguintes diretórios:
dir de origem
$ 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 de destino
$ tree -a dir2
dir2
|-- dir1
| `-- .svn
| `-- keepdir
|-- dir2
| `-- .svn
| `-- keepdir
|-- dir3
| `-- .svn
| `-- keepdir
`-- dir4
`-- .svn
`-- keepdir
Executando o rsync
comando acima :
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 resultante depois:
$ 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
Por que isso funciona?
A parte principal desse script é usar o recurso de filtros do rsync
. Os filtros permitem remover arquivos do conjunto correspondente em vários pontos do comando. Portanto, no nosso caso, estamos filtrando todos os arquivos que correspondem ao padrão */.svn*
. Os modificadores -rs_
informam ao filtro que queremos filtrar tanto no lado da fonte quanto no lado do destino.
trecho da seção FILTER NOTES da página de manual do rsync
Um s é usado para indicar que a regra se aplica ao lado de envio. Quando uma regra afeta o lado do envio, impede que os arquivos sejam transferidos. O padrão é que uma regra afete os dois lados, a menos que tenha
--delete-excluded
sido especificado. Nesse caso, as regras padrão se tornam apenas do lado do remetente. Consulte também as regras hide (H) e show (S), que são uma maneira alternativa de especificar as inclusões / exclusões do lado do envio.
Um r é usado para indicar que a regra se aplica ao lado receptor. Quando uma regra afeta o lado do recebimento, impede que os arquivos sejam excluídos. Veja o modificador s para mais informações. Consulte também as regras de proteção (P) e risco (R), que são uma maneira alternativa de especificar inclusões / exclusões do lado do receptor.
Veja man rsync para mais detalhes.
Dicas para descobrir isso (dica usando --dry-run
)
Ao descrever como fazer isso, pensei em mencionar a --dry-run
opção rsync
. É extremamente útil ver o que acontecerá sem que o rsync
evento realmente ocorra.
Por exemplo
O uso do comando a seguir fará uma execução de teste e nos mostrará a lógica de decisão por trás 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 saída acima, você pode ver que os ./svn
diretórios estão sendo protegidos por nossa regra de filtro. Informações valiosas para depurar o arquivo rsync
.
Referências
include="*/"
inclui.svn
, editando a resposta. Enfim, depois de renomear o problema permanece.-C
einclude="*/"
não parece ser um amigo muito próximo :(Ok, depois de várias tentativas, resolvi isso:
Obrigado
fonte
.svn/
diretórios--prune-empty-dirs
caso estejam vazios. Outra abordagem, esta duplicando dirs vazios:rsync -vaiz --delete --exclude=.svn/ --include='*.php' --include='*.js' --include='*/' --exclude='*' /origin /destination
--exclude=.svn/
antes do--include
's-C
. Fico feliz que você tenha entendido!Embora isso não esteja usando o rsync, outra opção é usar o find e o cpio. Por exemplo, eu tenho um diretório chamado Fotos e que é o ano e o mês.
Mas aqui eu tenho jpg, dng, xml e outras coisas e quero apenas os jpgs para fazer isso
"cd" para o diretório acima do diretório Fotos, em seguida:
E lá vai
Você pode usar esse método para muitas coisas; anos atrás, é assim que copiaríamos o sistema de arquivos / ao mover para discos maiores, como copiaria os arquivos do dispositivo.
fonte