Como excluir vários diretórios com o rsync?

184

Estou tentando fazer backup do meu diretório pessoal usando o rsync e quero excluir alguns dos diretórios que contêm lixo eletrônico. Eu quero excluir especificamente /home/ben/.ccachee /home/ben/build. Infelizmente, a documentação do rsync estava sobrecarregada de informações e não respondeu à minha pergunta. Isto é o que eu tentei:

rsync -arv --exclude "/home/ben/.ccache:/home/ben/build" /home/ben /media/ben/thumbdrive/

Qual é a maneira certa de fazer isso?

Freedom_Ben
fonte
4
Só queria dizer que a bandeira aimplica rjá :)-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
Populus

Respostas:

238

OK, eu me sinto muito idiota. Antes mesmo de postar essa pergunta, meu amigo me mostrou como fazê-lo e é realmente simples. Para excluir vários diretórios, basta usar vários --exclude=pathcomutadores. Portanto, meu comando acima, escrito corretamente, é o seguinte:

rsync -arv --exclude=.ccache --exclude=build /home/ben /media/ben/thumbdrive/
Freedom_Ben
fonte
7
Um caminho absoluto não funcionou para mim (o diretório especificado não foi silenciosamente excluído), enquanto um caminho relativo ao diretório de origem funcionou corretamente. Talvez esteja faltando alguma coisa, mas eu seria cauteloso com a afirmação do @FreeSoftwareServers de que caminhos absolutos sempre funcionam.
Soren Bjornstad 20/08/16
5
FYI: A opção -ainclui, -rportanto, -aré redundante.
David
4
Ao contrário do que o FreeSoftwareServers acredita, o caminho de exclusão é relativo ao caminho de origem, NOT /. Portanto, esse comentário é categoricamente falso e levará a falhas se você o seguir. A melhor estratégia é deixar de fora as principais / excluídas para evitar esse tipo de erro mental. Se a fonte for, / home / me e se você excluir = '/ mydir /', isso excluirá o diretório mydir em / home / me, ou seja, ele excluirá / home / me / mydir NOT / mydir / at /. É uma pena que eu não possa votar nem editar esse comentário, pois ele é tecnicamente errado e pode enganar.
Lizardx 6/09
3
Para sua informação, para viajantes posteriores, parece que o comentário em questão de @FreeSoftwareServer foi removido. tl; dr: use caminhos relativos
Freedom_Ben 6/17
2
Se você é burro, eu também e eu outros 179 promotores!
Sridhar Sarnobat 22/09
108

Ao ter vários diretórios e / ou arquivos a serem excluídos, crie um arquivo de texto e use a --exclude-fromopção Faça um arquivo chamado exclude_me.txte nele liste suas exclusões. Exemplo ( /home/ben/exclude_me.txt):

.ccache
build
.java
.gvfs
.xsession-errors

Então seu rsync ficaria assim:

rsync -arv --exclude-from='/home/ben/exclude_me.txt' /home/ben /media/ben/thumbdrive/

Estas são algumas informações sobre regras de filtro que podem ajudar:

  • /dir/ significa excluir a pasta raiz /dir
  • /dir/*significa obter a pasta raiz, /dirmas não o conteúdo
  • dir/ significa excluir qualquer pasta em qualquer lugar onde o nome contenha dir/

  • Exemplos excluídos: /dir/, /usr/share/directory/, /var/spool/dir/ /var/spool/lpd/cfsignifica ignorar arquivos que começam com cfqualquer pasta dentro/var/spool/lpd

Consulte também a seção de regras de filtro na página do manual.

user228759
fonte
4
É importante observar que a pasta raiz significa a raiz da transferência e não o diretório raiz.
jamesdlin
Esta é uma resposta brilhante!
Alexander Zhukov
85

Você também pode excluir vários caminhos dentro de chaves:

rsync -arv --exclude={.ccache,build} /home/ben /media/ben/thumbdrive/
György Ráth
fonte
40
isso funciona muito bem, não apenas sob sh, apenas sob bash, eu descobri "da maneira mais difícil"
xor
7
Não há espaço após a vírgula. Aprendi que a maneira dura muito 😭
styl3r
E não use '' like --exclude = '. Gvfs'
Martin T.
FWIW, acho que os aparelhos funcionam com o ksh. Para outros shells, você provavelmente poderia usar algo como: IFS=$'\n'; rsync -arv $(printf '.ccache\nbuild\n' | sed 's/^/--exclude=/g') /home/ben /media/ben/thumbdrive/. Ou você pode simplesmente usar vários --excludeargumentos, os quais você teria que digitar manualmente.
TSJNachos117 24/01
1
A razão pela qual isso funciona é por causa da "expansão de chaves", caso alguém queira ver os detalhes.
shredalert 5/06