Aplicar dado rsync excluir padrões em determinado diretório

1

Eu tenho uma configuração onde eu uso rsync para espelhar algum diretório source para um (remoto) destino exceto por alguns arquivos e locais definidos que excluem padrões rsync:

# Useless files
- thumbs.db
- *.~
- *.tmp
- /*/.cache
- /*/.local/share/trash
# Already rsynced somewhere
- .dropbox
# Medias files
- *.avi
- *.mkv
- *.wav
- *.mp3
- *.bmp
- *.jpg
# System files
- /hiberfil.sys
- /pagefile.sys

Este script é executado em estações Windows e Linux e usa o parâmetro --delete para excluir arquivos estranhos do diretório dests .

A coisa é, quando eu "atualizo" os padrões de exclusão (por exemplo, adicionar um padrão de exclusão para arquivos Ogg: *.ogg ) Eu tenho que re-executar o rsync para remover qualquer arquivo Ogg existente do destino. p>

Eu queria saber se eu poderia facilmente aplicar as regras de exclusão (algumas podem ser complexas porque ele usa curingas) em um determinado diretório para que eu não precise executar novamente o rsync da fonte para limpar meu diretório de destino.

Até o momento cheguei ao seguinte, que exclui arquivos e diretórios usando a correspondência de nome de base:

dirToClean="/var/somedir"
excludeFile="file_to_exclude"

# Delete files and dir of $dirToClean whose basename matches an exclude pattern from $excludeFile
for fileToDelete in $(grep --extended-regexp "^- .*" $excludeFile | sed 's/^- \(.*\)$//'); do
    find "$dirToClean" -iname "$fileToDelete" -exec rm {} \;
done

Talvez eu possa executar o rsync usando o mesmo diretório da origem e do destino?

    
por CDuv 28.08.2014 / 00:43

2 respostas

0

Seguindo os conselhos de Kyle Jones para usar as opções de rsync disponíveis para fazer o trabalho (em vez de codificar um) eu encontrei

rsync --include-from=file_to_exclude --recursive \
--delete-excluded \
/var/somedir/ /var/somedir/

para funcionar bem. Eu também tentei usar --ignore-existing --ignore-non-existing --delete em vários cenários, mas o resultado foi o mesmo que sem essas 3 opções.

    
por 31.08.2014 / 01:45
0

Não faça isso. É uma péssima ideia tentar replicar o que os padrões de inclusão / exclusão de rsync fazem sem usar o rsync. O fato de alguns dos padrões poderem ser complexos é ainda mais um motivo para não tentar. Use o próprio rsync para garantir um comportamento consistente e minimizar surpresas.

Na página de manual do rsync:

--existing, --ignore-non-existing

          This  tells rsync to skip creating files (including directories)
          that do not exist yet on the destination.   If  this  option  is
          combined  with  the  --ignore-existing  option, no files will be
          updated (which can be useful if all you want to do is to  delete
          extraneous files).

Portanto, você deve executar com --delete --delete-excluded --ignore-existing --ignore-non-existing e o rsync removerá arquivos externos e não atualizará nem removerá nenhum outro arquivo.

    
por 28.08.2014 / 03:36