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 comandofind
. 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 seriatail -n -1
. -
grep -Fv "$(tar -tf archive.tar)"
: Transmita a listagem do arquivo para um comando grep, que filtrará essas linhas da lista retornada porfind
, 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 usandosed
ouawk
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.