Extraia tar para um diretório, removendo quaisquer arquivos que ele NÃO contenha no arquivo

0

Digamos que eu tenha um tar grande, cujo conteúdo eu estou extraindo regularmente para um local constante.

Eu estou querendo manter este local como uma instância primitiva do tar extraído, e eu poderia evitar o processo muito dispendioso de sempre eliminar o diretório de saída apenas para atualizá-lo com uma pequena mudança que o tar pode ter usando o --keep-newer-files flag.

Mas o que eu faria para remover arquivos do local de saída que não existem mais no arquivo?

    
por Brett Rogers 19.09.2018 / 06:13

1 resposta

1

O comando padrão tar tem uma maneira de listar o conteúdo de um arquivo. A forma resumida para isso é tar -tf archive.tar .

Ao usar isso junto com find , grep e substituição de comando, você obtém o seguinte:

rm -f $(find . -d | head -n -1 | grep -Fv "$(tar -tf archive.tar)")

Execute este no diretório onde você deseja o conteúdo do arquivo, e substitua archive.tar pelo caminho do arquivo.

Trabalhando da direita para a esquerda para o pipeline dentro da substituição de comando mais externa:

  • find . -d : Lista todos os arquivos e diretórios no diretório atual, listando-os em ordem de profundidade. A primeira ordem de profundidade é importante aqui, já que planejamos usar essa lista de arquivos para exclusões e, portanto, devemos excluir o conteúdo do diretório antes de excluir os próprios diretórios.
  • head -n -1 : exclui a última linha do comando find . Isso removerá a entrada para /path , que pode ou não estar presente no arquivo. Se não estivéssemos fazendo as coisas em primeira ordem, isso seria tail -n -1 .
  • grep -Fv "$(tar -tf archive.tar)" : Transmita a listagem do arquivo para um comando grep, que filtrará essas linhas da lista retornada por find , portanto, somente os arquivos que não estiverem no arquivo serão passados para o% externo. comandorm.

Algumas notas:

  • Isso provavelmente não é bastante compatível com POSIX. Deve funcionar no GNU bash embora.
  • Isso depende de como o tar informa o conteúdo do arquivo e como o arquivo foi criado. Em particular, a listagem precisa corresponder a como find informa as coisas. Com o GNU tar e a maioria dos arquivos, o deve funcionar. Se não for para o seu caso, você provavelmente poderá fazê-lo funcionar usando sed ou awk na saída do comando tar dentro da substituição do comando mais interno.
  • Certifique-se e teste isso antes de usá-lo em dados de produção, se ele não funcionar por qualquer um dos dois motivos acima, é necessário remover tudo do diretório em que você o executa.
por 19.09.2018 / 21:20

Tags