Excluir arquivos estranhos do diretório dir via rsync?

51

Diga que eu tenho

SRC 
  001.jpg
  002.jpg
  001.txt
  a.zip

DEST
  hello.jpg

rsync -d --delete SRC:{*.jpg,*.txt} DEST

Não remove hello.jpg do DEST, tem alguma idéia de como arquivar isso?

Cheng
fonte

Respostas:

72

A razão pela qual seu comando não está funcionando é explicada pela página de manual do rsync (ênfase adicionada):

--excluir

Isso diz ao rsync para excluir arquivos estranhos do lado de recebimento (aqueles que não estão no lado de envio), mas apenas para os diretórios que estão sendo sincronizados. Você deve ter solicitado ao rsync para enviar o diretório inteiro (por exemplo, "dir" ou "dir /") sem usar um curinga para o conteúdo do diretório (por exemplo, "dir / *"), pois o curinga é expandido pelo shell e o rsync obtém um solicitação para transferir arquivos individuais, não o diretório pai dos arquivos. Os arquivos excluídos da transferência também são excluídos da exclusão, a menos que você use a opção --delete-deleted ou marque as regras como correspondendo apenas no lado do envio (consulte os modificadores de inclusão / exclusão na seção REGRAS DO FILTRO).

Assim, quando você executa

$ rsync -d --delete SRC:{*.jpg,*.txt} DEST

os arquivos indesejados no DEST não estão sendo excluídos porque, na verdade, você não solicitou a sincronização de um diretório, mas apenas alguns arquivos específicos. Para obter os resultados desejados, tente algo como isto:

rsync -d --delete-excluded --include '*.jpg' --include '*.txt' --exclude '*' SRC/ DEST/

Observe que a ordem das diretivas de inclusão e exclusão é importante. Essencialmente, cada arquivo é verificado nos padrões de inclusão ou exclusão na ordem em que aparecem. Portanto, os arquivos com extensões .jpg ou .txt são sincronizados, pois correspondem aos padrões "incluídos" antes de corresponderem ao padrão "*" excluído. Tudo o resto é excluído pelo --exclude '*'padrão. A --delete-excludedopção garante que mesmo os arquivos excluídos no lado DEST sejam excluídos.

Steven D
fonte
@Cheng, gostaria de explicar um pouco mais? Ficaria feliz em atualizar minha resposta se houver algum problema / melhoria.
Steven D
Funciona. Eu acho. O processo - coisas está me confundindo, me faça pensar que foi transferido novamente.
Cheng
Eu editei minha resposta para explicar um pouco mais.
Steven D
2
@Cheng: Eu suspeito que você não quer o --delete-excluded. Sem ele, apenas *.jpge *.txtpode ser excluído no lado do destino. Com isso, os arquivos não relacionados também serão excluídos. Você pode estar interessado neste tutorial sobre filtros rsync .
Gilles 'SO- stop be evil'
3
Obrigado! Para mim, estava faltando a barra no diretório de origem.
Vaughan