tar “--exclui-de” curinga de estrela dupla

2

Eu escrevi um script de backup no meu sistema Debian 8 que usa o comando tar com "--exclude-from" para excluir alguns arquivos / dir.

Isso funciona muito bem, mas hoje eu gostaria de excluir alguns arquivos que compartilham o mesmo padrão de caminho, como /home/www-data/sites/<some_string>log.txt ou diretórios como /home/www-data/sites/<one_or_two_directories>/vendor .

Eu tentei anexar /home/www-data/sites/*log.txt no arquivo, mas o tar falha e gera no stderr os seguintes erros:

tar: /home/www-data/sites/*log.txt: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

Senti falta de algo ao tentar usar * ou ** ?

Eu li então que no Unix, programas geralmente não interpretam curingas em si , o que significa que * não é expandido nem ** por tar.

Até onde eu sei, meu último recurso aqui é expandir a lista usando bash e anexá-la ao arquivo de exclusão (se ainda não estiver lá) antes da chamada tar . Existe uma maneira mais limpa?

EDITAR

Aqui está o trecho de script ...

# ...
broot=$(dirname "${PWD}")
i="${PWD}/list.include"
x="${PWD}/list.exclude"
o="$broot/archive.tgz"
tar -zpcf $o -T $i -X $x
# ...

Dans aqui é o arquivo de exclusão ..

/etc/php5/fpm
/etc/nginx
/etc/mysql
/home/me/websites/*log.txt
/home/me/websites/**/vendor

O objetivo é excluir todos os arquivos de log localizados dentro do diretório "websites" e todos os diretórios "vendor" que podem ser encontrados em qualquer subdiretório de "websites".

Obrigado!

    
por Stphane 31.12.2015 / 16:12

2 respostas

7

O shell expande caracteres curinga em argumentos, portanto, a maioria dos aplicativos não precisa executar nenhuma expansão de caractere curinga. No entanto, a lista de exclusão do tar faz suporta curingas, que correspondem aos curingas suportados pelos shells tradicionais. Cuidado, pois pode haver pequenas diferenças; por exemplo, o tar não distingue * e ** como ksh, bash e zsh can. Com tar, * pode corresponder a qualquer caractere, incluindo / , portanto, por exemplo, */.svn exclui um arquivo chamado .svn em qualquer nível da hierarquia. Você pode usar tar --no-wildcars-match-slash e, nesse caso, * não corresponde aos separadores de diretório.

Por exemplo, excluir /home/me/websites/*log.txt exclui /home/me/websites/log.txt , /home/me/websites/foo-log.txt e /home/me/websites/subdir/log.txt . A exclusão de /home/me/websites/**/vendor exclui /home/me/websites/one/vendor e /home/me/websites/one/two/vendor , mas não /home/me/websites/vendor . Com a opção --no-wildcars-match-slash , /home/me/websites/*log.txt não exclui /home/me/websites/subdir/log.txt e /home/me/websites/**/vendor não exclui /home/me/websites/one/two/vendor .

tar … --exclude='/home/www-data/sites/*include' … exclui os arquivos e diretórios em /home/www-data/sites cujo nome termina com include . Você pode sair sem as aspas, mas não se você escrever --exclude /home/www-data/sites/*include (porque o shell expandiria os curingas antes que tar possa vê-los) ou se você usar um shell que sinalize um erro em curingas não correspondentes (por exemplo, zsh em sua configuração padrão - e recomendada).

A opção --exclude-from requer um nome de arquivo. O arquivo deve conter um padrão por linha. Não confunda --exclude (seguido por um padrão) e --exclude-from (seguido pelo nome de um arquivo contendo padrões).

    
por 01.01.2016 / 03:24
0

Seu comando provavelmente foi citado incorretamente (e uma rápida verificação aqui funciona como esperado). De acordo com o manual de referência, o GNU tar reconhece os curingas do shell:

por 31.12.2015 / 21:28

Tags