globstar
para o resgate?
shopt -s globstar
tar -cz archive.tar.gz file1 file2 subdir/**
A estrutura de diretórios do nosso servidor é assim
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?
globstar
para o resgate?
shopt -s globstar
tar -cz archive.tar.gz file1 file2 subdir/**
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