Como excluir diretórios numéricos com o rsync?

6

Eu sei que o rsync tem uma opção --exclude que eu uso com bastante frequência. Mas como posso especificar que deve excluir todos os diretórios "numéricos"?

Na lista de diretórios abaixo, gostaria apenas de copiar css , html e include

.
..
123414
42344523
345343
2323
css
html
include

Normalmente minha sintaxe é algo como

rsync -avz /local/path/ user@server:/remote/path/ --exclude="cache"

Acho que deve ser algo como --exclude="[0-9]*" , mas não acho que funcione.

    
por cwd 05.10.2011 / 17:17

5 respostas

5

A opção exclude do rsync não suporta realmente a regex, é mais uma correspondência de padrões de shell globbing.

se esses diretórios forem bastante estáticos, você deve apenas listá-los em um arquivo e usar --exclude-from=/full/path/to/file/exclude_directories.txt .

Atualizado para fornecer exemplo

Primeiro, basta colocar os diretórios em um arquivo:

find . -type d -regex '.*/[0-9]*$' -print > /tmp/rsync-dir-exlcusions.txt

ou

( cat <<EOT
123414
42344523
345343
2323
EOT ) > /tmp/rsync-directory-exclusions.txt

então você pode fazer seu trabalho de rsync

rsync -avHp --exlude-from=/tmp/rsync-directory-exclusions.txt /path/to/source/ /path/to/dest/

Você só precisa de uma etapa extra para configurar o arquivo de texto que contém os diretórios de exclusão, 1 por linha.

tenha em mente que o caminho dos diretórios no trabalho é o caminho relativo de como o rsync vê o diretório.

    
por 05.10.2011 / 17:55
4

Você não pode dizer "um nome que contém apenas dígitos" na sintaxe padrão do rsync. Portanto, inclua todos os nomes que contenham um não dígito e exclua o restante.

rsync --include='*[!0-9]*' --exclude='*/' …

Veja também meu guia padrão de rsync .

    
por 06.10.2011 / 01:49
1

Use find para fazer uma lista dos diretórios a serem excluídos, então use a opção --exclude-from do rsync como Tim Kennedy descreveu.

    
por 05.10.2011 / 18:18
1

Você pode fazer isso em uma linha:

rsync -avHp --exclude-from=<(cd /path/to/source; find . -type d -regex './[0-9]*' | sed -e 's|./||') /path/to/source/ /path/to/dest/
    
por 05.10.2011 / 23:41
-1

Use este comando:

$> rsync -avlH --exclude=*.ibd --exclude-from=<(ls -p | grep -v / | \
   grep -E 'ibdata|ib_logfile')  /mnt/myfuse/ /u01/my3309/data/
    
por 13.07.2018 / 13:46