rsync: como incluir arquivos com nome terminando em uma string específica [duplicada]

4

Eu gostaria de usar o rsync para transferir todos os arquivos de um servidor (ou servidor-via-ssh) que tem uma string final específica, como uma extensão de tipo de arquivo como tar.gz . Eu quero todos eles, independentemente de quão profundo eles possam ir, agora ou no futuro. Mas isso pode ser mais do que apenas a extensão. Em um caso, quero que todos os arquivos terminem em -server-cloudimg-amd64-root.tar.gz . E igualmente importante, eu não quero obter nenhum outro arquivo, mesmo se eles estiverem em caminhos menores.

O caso simples de --include="**/*-server-cloudimg-amd64-root.tar.gz não os obtém. Eu sei rsync incluir / excluir não é simples e não esperava que isso funcione. Eu sei que há alguma necessidade de especificar diretórios para também serem transferidos. Mas a lógica do rsync tem sido um mistério perpétuo para mim (não como qualquer regra de ACL de caminho que já vi) devido ao fato de que também requer diretórios parentes correspondentes separadamente. Eu acho que o que é necessário é simplesmente uma opção com a semântica que diz "se este arquivo corresponder, incluir todos os diretórios necessários para fazer a transferência sem implicar qualquer outra coisa" da mesma maneira que o comando mkdir -p ${DIRNAME} criaria os pais do diretório nomeado, conforme necessário. Não vejo essa opção no rsync. Existe alguma maneira simples de fazer isso de uma só vez?

    
por Skaperen 08.09.2012 / 21:42

2 respostas

8

Neste caso, quando você não tem acesso físico ao servidor remoto, você deve entrar em contato com todos os includes e exclui. Existe um excelente post aqui, no SE (veja a resposta em destaque):

Filtro Rsync: copiando somente um padrão

Eu acho que você precisará de algo como

rsync -am --include='*.tar.gz' --include='*/' --exclude='*' SOURCE DESTINATION
    
por 08.09.2012 / 22:24
0

Você deseja usar find :

find /top/level/path -name '*.tar.gz' -exec rsync {} +

top/level/path é o diretório de nível superior e a pesquisa seria executada em todos os seus subdiretórios. Você pode usar as opções -maxdepth ou -mindepth se quiser restringir sua pesquisa e usar curingas como ? ou * com -name .

É claro que você pode adicionar opções adicionais a rsync , como rsync -av . A parte final - {} + - alimenta o rsync com a lista de arquivos encontrados pelo comando find .

Se você quiser ver a lista de arquivos que seriam passados para o rsync, você pode testá-lo através do sybstituting rsync with echo :

find /top/level/path -name '*.tar.gz' -exec echo {} +
    
por 08.09.2012 / 21:53

Tags