Quando uso o tar, as exclusões são globais e substituem as inclusões, o que significa que não posso especificar uma exceção para uma exclusão. Por exemplo, se eu tiver um caminho a/b/c
e eu quiser incluir o diretório a e excluir o diretório b, não será possível incluir o diretório c. Ou na linha de comando:
tar -cvf foo --exclude=a/b a a/b/c
A especificação a/b/c
não tem efeito.
Soluções / soluções alternativas que conheço são:
especifique tudo em a
que você deseja incluir, mas não liste a/b
e também especifique o caminho a/b/c
(realmente 1a) use o shell e outras ferramentas com redirecionamento ou a opção --files-from
para fazer isso para você, como ls
e find
, e curingas / regex e caminhos de diretório
chame tar
mais de uma vez, sem compactação. Cada chamada de tar pode especificar uma inclusão e uma exceção a essa inclusão (ou realmente quantas você quiser de ambos, contanto que você não encontre o problema de substituição global acima) e adicione ao mesmo arquivo. Comprima quando feito, se desejar.
Quaisquer outras que eu não conheça? Alguma recomendação de usuários experientes?
Meu caso de uso atual está no desenvolvimento de software: estou chamando tar
de um programa e não estou invocando um shell, embora eu pudesse. Eu também tenho a oportunidade de ler diretórios e listar os arquivos dessa maneira, então a digitação tediosa não é realmente um problema.
No entanto, meu programa envolve um grande conjunto de arquivos definidos pelo usuário: o usuário informa ao software quais arquivos devem ser incluídos, com o mínimo de esforço por parte do usuário. Uma especificação que será definida e, em seguida, usada repetidamente na execução e, provavelmente, atualizada ocasionalmente ao longo de meses ou anos. Meu pensamento atual é um arquivo de configuração simplificado, onde uma inclusão é um caminho e uma nova linha, e uma exceção a essa inclusão é colocada imediatamente após a inclusão e é um prefixo seguido por um caminho e uma nova linha, por exemplo, o exemplo acima ser algo como:
a
-a/b
a/b/c
Os objetivos dessa ideia são legíveis para humanos, significados claros, fáceis de editar e fáceis de redirecionar para saída de comandos comuns e uso com pouca ou nenhuma edição da saída. Recursos adicionais podem ser necessários em algum momento, como mais suporte a tipo wildcard / regex, condicionais, etc.
No entanto, a especificação do usuário de grandes conjuntos de arquivos é um lugar comum. Todo mundo lida com conjuntos de arquivos em sistemas de arquivos. E está no backup, está sincronizado, está na instalação, na implantação, no controle de origem, na cópia / migração etc. E se a especificação do usuário for geral, via curingas, diretórios, etc., uma única especificação pode ser frequentemente reutilizada, arquivos na mudança do sistema.
O shell fornece um idioma, cada backup e outra ferramenta de software parecem ter seu próprio idioma. Existem elementos muitas vezes / por vezes comuns, mas o utilizador tem de aprender as nuances da ferramenta específica para poder interagir com ela - como aprender que as exclusões são globais e substituir inclusões mais específicas no alcatrão, ou quais são os caracteres universais e como eles funcionam. Parece que deveria haver alguma linguagem comum geral com significado bem definido para essa tarefa. Então, alguém sabe de uma especificação ou termos comumente acordados ou elementos ou comportamentos para isso? Alternativamente, algum conselho aqui para evitar errar no meu caso?
EDIT: Essa pergunta deve ser movida para o ServerFault ou outro site do StackExchange?
Tags tar