Como excluir uma pasta do rsync

60

Estou tentando fazer backup da minha pasta pessoal na minha unidade NAS. Eu estou dando isso:

rsync -Paz --exclude-from 'rsync-exclude.txt' /home/chris/ [email protected]:LinuxHome

onde rsync-exclude.txttem esse conteúdo:

/home/chris/Downloads/*
/home/chris/Downloads/
/home/chris/Downloads/*.*

e está na mesma pasta que eu executo o rsync (pasta pessoal).

No entanto, o rsync também tenta copiar esta pasta.

O que estou fazendo errado?

xpanta
fonte

Respostas:

88

Você está fornecendo caminhos absolutos em sua lista de exclusões.

Com o rsync, todos os caminhos de exclusão (ou inclusão!) Iniciados por /são ancorados à " raiz da transferência ".

A raiz da transferência neste caso é /home/chris. Se você fez:

rsync -Paz --exclude-from 'rsync-exclude.txt' / [email protected]:

... então suas exclusões devem funcionar (mas você copiaria todo o resto desse sistema de arquivos!).

Mas desde que você está apenas tentando sincronizar sua casa diretório, e não há nenhum subdiretório /home/chrischamado "home/chris/Downloads", rsyncnão encontra nada que corresponda.

Portanto, tente remover as /home/chrispartes do seu rsync-exclude.txtarquivo.

Na verdade, você só precisa de uma única linha no arquivo:

/Downloads

Observe que, se você não especificar o líder /e tiver outros diretórios nomeados "Downloads", eles também serão excluídos. Suponho que você queira excluir apenas o diretório "de nível superior" (relativo ao diretório de origem, também conhecido como "raiz da transferência") Downloads, portanto, você desejará a liderança /.

A MANEIRA MAIS FÁCIL (para excluir apenas alguns caminhos)

Se você precisar excluir apenas um diretório, faça isso (evitando um arquivo separado):

rsync -Paz --exclude /Downloads /home/chris/ [email protected]:LinuxHome

Você também pode encadear --excludetags da seguinte maneira:

rsync -Paz --exclude /Downloads --exclude '/Something Else' --exclude .hiddenFile /home/chris/ [email protected]:LinuxHome

Observe que, como não há barra, essa será excluída .hiddenFilede todos os diretórios que copiar!

Mas se você tiver mais do que algumas exclusões, é melhor usar --exclude-fromum arquivo.

Nota

Vejo que você acertou, mas os novos no rsync devem observar a barra no final de/home/chris/

Para citar a rsyncpágina de manual, "Você pode pensar em uma fonte à direita / no sentido de" copiar o conteúdo deste diretório "em vez de" copiar o diretório pelo nome ".

Portanto, se você deixar essa barra final, você terminará com um diretório chamado chrisdentro do diretório de destino, contendo tudo /home/chris(exceto o Downloadsdiretório original , é claro!).

Lambart
fonte
2

Isso pode ser mais fácil para os olhos e apenas uma observação sobre a exclusão de diretórios e sintaxe:

SRC='/home/username'
DST='/run/media/username/EasyStoreRT/rsync'

rsync -avrh --stats                                 \
    --log-file=/home/username/log/rsync-home.log    \
    --exclude='/username/.cache'                    \
    --exclude='/username/.local/share/Trash'        \
    $SRC \
    $DST \

Ele excluirá esses diretórios e todos os arquivos dentro deles. Por qualquer motivo, o rysnc não estava anexando / home / username ao /.cache. Somente home / se ancoraria, então eu tive que adicionar / username a cada diretório excluído.

As páginas de manual dizem "se o padrão começa com um / então está ancorado em um ponto específico na hierarquia de arquivos; caso contrário, é comparado com o final do nome do caminho". Mas, essa hierarquia parece ser apenas o primeiro diretório no diretório de origem. Estou usando o bash, versão 4.4.23 (1) -release.

jltrinchard
fonte