Respostas:
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-excluded
opção garante que mesmo os arquivos excluídos no lado DEST sejam excluídos.
--delete-excluded
. Sem ele, apenas *.jpg
e *.txt
pode 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 .