find / tar combinação para backup de determinados arquivos em um nível, e todos os arquivos em um subdiretório

1

A estrutura de diretórios do nosso servidor é assim

  • / home / site1 / public_html
  • / home / site1 / logs
  • / home / site1 / cgi-bin
  • etc ... (é o padrão ao usar o virtualmin)

O que eu quero agendar backups é os diretórios public_html + alguns arquivos no site1 / level (muitas vezes há alguns scripts úteis escritos nesses níveis, mas também há inevitavelmente um monte de arquivos inchados lá também como despejos temp db que eu não quero encher o servidor de backup a cada trabalho)

Aqui está o que eu gostaria de fazer, se possível (de / home /):

tar -cz --include="*.sh" --include="*.php" --include="public_html/*" ./site1/ | ssh backupserver ...

Mas o tar não tem uma opção include, apenas exclui.

Eu tentei

find ./site1/ -type f -name "*.sh" -or -name "*.php" -or -wholename "./site1/public_html/*" | xargs tar -cz | ssh backupserver ...

Mas isso não funciona porque xargs quebra uma grande lista de arquivos em pedaços, fazendo com que cada reinicialização do comando tar -c sobrescreva o arquivo anterior (e se eu não usar xargs, então há um erro para a lista ser muito longa).

Eu não posso usar a opção -r para anexar ao backup porque 1) ele não funciona em arquivos compactados e 2) Eu não acho que isso funcionaria no ssh de qualquer maneira.

A única solução em que consigo pensar é dividi-la em etapas, criando localmente um arquivo tar temporário (um para tar ./site1/public_html/ e outro para anexar ./site1/*.[sh|php]). zipping, em seguida, ssh, em seguida, exclua o arquivo local. Mas isso parece quase ridículo no linux.

Existe algum formato para o comando tar que eu possa usar e que esteja faltando?

    
por Inukshuk 12.03.2014 / 17:22

2 respostas

1

globstar para o resgate?

shopt -s globstar
tar -cz archive.tar.gz file1 file2 subdir/**
    
por Oli 14.03.2014 / 12:30
0

pax , esta é a sua hora de brilhar!

find ./site1/ \( -path "./site1/public_html" -prune -o -name "*.sh" -o -name "*.php" \) -print |
    pax -x ustar -wf archive.tar

Ou quando você tem um find e pax que suportam dados delimitados por NUL:

find ./site1/ \( -path "./site1/public_html" -prune -o -name "*.sh" -o -name "*.php" \) -print0 |
    pax -x ustar -0wf archive.tar
    
por geirha 14.03.2014 / 14:01