Rsync Exclui Pastas

2

Estou executando um script rsync e desejo excluir determinadas pastas. Eu sei que com rsync você tem que criar um arquivo .txt e adicionar todas as exclusões lá, mas eu estou querendo saber se é possível ter apenas uma string global no script que inclui todas as exclusões que eu quero e, em seguida, apenas acrescentou que global o comando rsync?

Exemplo de sequência global

ROOT_EXCLUDE="--exclude=/dev --exclude=/proc --exclude=/sys --exclude=/temp --exclude=/run --exlucde=/mnt --exlcude=/media

Comando Rsync

rsync -au --exclude 'ROOT_EXCLUDE' /Users/Me/Home /Users/me/Backup
    
por patrick 07.04.2015 / 13:28

1 resposta

1

Se os elementos da sua lista de exclusão não contiverem espaços em branco ou curingas, você poderá definir uma variável ROOT_EXCLUDE e usá-la sem aspas. Expansões de variáveis sem aspas dividem o valor da variável em cada sequência de espaços em branco¹; então, cada elemento é expandido como um padrão de caractere curinga, se ele contiver qualquer caractere curinga.

ROOT_EXCLUDE="--exclude=/dev --exclude=/proc --exclude=/sys --exclude=/temp --exclude=/run --exclude=/mnt --exclude=/media"
rsync -au $ROOT_EXCLUDE /Users/Me/Home /Users/me/Backup

Se você quiser usar curingas na lista de exclusão, isso funcionará em shells padrão, desde que você não tenha nenhum arquivo cujo nome corresponda ao padrão. Essa é uma suposição escorregadia para palavras como --exclude=*.bak e geralmente não é o caso se você escreve --exclude *.bak . Para evitar essa armadilha, você pode desativar a expansão de curingas.

ROOT_EXCLUDE="--exclude=/dev --exclude=*.bak"
set -f
rsync -au $ROOT_EXCLUDE /Users/Me/Home /Users/me/Backup
set +f

Em shells que suportam arrays (ksh, bash, zsh, mas não sh simples), você pode colocar a lista de argumentos em um array . Este é o método recomendado para colocar uma lista de argumentos em uma variável.

#!/bin/bash
…
ROOT_EXCLUDE=('--exclude=/dev' '--exclude=*.bak')
rsync -au "${ROOT_EXCLUDE[@]}" /Users/Me/Home /Users/me/Backup

O sh simples (qualquer shell Bourne / POSIX, por exemplo, sh ou dash ) tem um único array sem nome (os parâmetros posicionais $1 , $2 ,…) que você pode definir com set -- … . Se você precisar alterar temporariamente os parâmetros posicionais, faça a alteração temporária em uma função: cada chamada de função tem seu próprio conjunto de parâmetros posicionais.

set -- '--exclude=/dev' '--exclude=*.bak'
rsync -au "$@" /Users/Me/Home /Users/me/Backup

Em vez de soletrar uma lista de diretórios a serem excluídos, você deve passar a opção -x para pular os pontos de montagem. Isso vai cuidar de /proc , /sys , etc. Você precisará, entretanto, incluir explicitamente todas as fontes, se quiser fazer o backup de arquivos em várias partições. Se você estiver fazendo backup de diretórios pessoais, provavelmente não há sistemas de arquivos na memória para ignorar de qualquer maneira, mas pode haver sistemas de arquivos de rede ou outros sistemas de arquivos FUSE.

rsync -ax /Users/Me/Home /Users/me/Backup

¹ Mais geralmente, com base no valor de IFS .

    
por 08.04.2015 / 02:00