tar exclui demais

1

Ao executar tar em /, como posso excluir, por exemplo? "/ sbin", embora não exclua também "/ usr / sbin"?

Alguns detalhes: É opinião generalizada que tar --exclude=dir apenas exclui "dir" e suas subpastas vistas do diretório de trabalho atual do tar.

Eu não encontrei nenhuma documentação que segure essa opinião e realmente achei errado. Eu estava testando com antigos SuSEs, alguns CentOS e com Debian de Lenny para Jessie: tar --exclude=dir exclui "dir" onde quer que ele seja encontrado!

Prova de conceito:

cd /tmp
mkdir -p dira/dirb/{a,b,c,d,e}
mkdir -p dirc/dira/{a,b,c,d,e}
tar c dir? | tar t

Você verá todos os diretórios criados no arquivo "tar" criado. Isso está ok. Mas com:

tar c dir? --exclude=dira/* | tar t

a saída é:

dira/
dirc/
dirc/dira/

Excluir o diretório em si, em vez de seu conteúdo, é da mesma forma:

tar c dir? --exclude=dira | tar t

dá:

dirc/

Não é isso que eu queria! Eu quero excluir "dira / ", mas sem excluir "dira / " quando o próprio dira é uma subpasta de algum outro diretório.

Colocar algum arquivo de tags em "dira" ajudaria, mas às vezes você não pode fazer isso, por exemplo. se o usuário de backup não tiver permissão de gravação para os diretórios de exclusão ou se for simplesmente importante que o diretório não seja alterado ...

    
por hacky-sack 01.04.2016 / 16:44

3 respostas

1

Se você estiver usando o gnu tar, há um extenso manual aqui que discute a opção --anchored e como os padrões de glob para excluir e incluir diferem. Você pode tentar:

tar c dir? --anchored --exclude=dira | tar t
    
por 01.04.2016 / 17:19
0

Infelizmente, tar não funciona dessa maneira; ele considera o nome do arquivo whole (incluindo sub-diretórios ou diretórios pai) e considera as correspondências parciais como muito bem. O que você quer fazer não é possível com apenas tar.

Felizmente, você está em um sistema unix, então você tem toda uma caixa de ferramentas, não apenas um único comando. Você poderia fazer algo ao longo destas linhas:

find . -print | grep -v '^\./dira' | xargs -d '\n' tar cf ../output.tar

o primeiro imprime todos os nomes de arquivos no diretório atual; o segundo filtra o que você não quer usando uma expressão regular nos nomes de arquivos. O caractere ^ nessa expressão regular garante que a correspondência seja somente válida para arquivos que iniciam com o restante da regex (ou seja, seu diretório dira e qualquer de seus arquivos ou subdiretórios). O último comando no pipeline lê a saída dos dois primeiros e transforma isso em uma linha de comando para o tar, onde o tar recebe uma lista de arquivos para adicionar ao arquivo.

    
por 01.04.2016 / 17:02
0

Por que você vê a exclusão de / usr / sbin ao tentar excluir apenas / sbin :% man tar ( link ) mostra:

--exclude=PATTERN
    exclude files, given as a PATTERN

Não é DIR, mas sim PATTERN, e / sbin corresponde a / usr / sbin.

O que você pode fazer sobre isso para incluir um DIR em um DIR excluído : Primeiro tar up / com / sbin excluded (que também exclui / usr / sbin) com a saída indo para o arquivo archive.tar, então use a opção APPEND para anexar / usr / sbin ao arquivo archive.tar:

tar -cf archive.tar / --exclude=/sbin #### Partial Contents
tar -Af archive.tar /usr/sbin #### Contains everything you want
    
por 01.04.2016 / 17:26

Tags