Apaga arquivos estranhos do diretório dest via rsync?

48

Digamos que eu tenha

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

DEST
  hello.jpg

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

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

    
por Cheng 06.01.2011 / 09:29

1 resposta

72

O motivo pelo qual seu comando não está funcionando é explicado pela página de manual do rsync (ênfase adicionada):

--delete

This tells rsync to delete extraneous files from the receiving side (ones that aren’t on the sending side), but only for the directories that are being synchronized. You must have asked rsync to send the whole directory (e.g. "dir" or "dir/") without using a wildcard for the directory’s contents (e.g. "dir/*") since the wildcard is expanded by the shell and rsync thus gets a request to transfer individual files, not the files’ parent directory. Files that are excluded from the transfer are also excluded from being deleted unless you use the --delete-excluded option or mark the rules as only matching on the sending side (see the include/exclude modifiers in the FILTER RULES section).

Assim, quando você executa

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

os arquivos indesejados em DEST não estão sendo excluídos porque você não solicitou que um diretório fosse sincronizado, mas apenas para alguns arquivos específicos. Para obter os resultados desejados, tente algo assim:

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 em relação aos padrões de inclusão ou exclusão na ordem em que aparecem. Assim, 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 padrão --exclude '*' . A opção --delete-excluded garante que até mesmo os arquivos excluídos no lado DEST sejam excluídos.

    
por 06.01.2011 / 19:46

Tags