Isso deve funcionar:
tar -tzf archive.tar.gz | sed 's@^//*@@' | sort -r | xargs -d '\n' rm -d
Se o seu arquivo contiver caminhos absolutos e você tiver descompactado para os locais absolutos (para isso, você precisa usar a opção -P
de tar
) você tem que deixar de fora sed
. Você também pode deixar sed
out, se tiver certeza absoluta de que não há caminhos absolutos no seu arquivo.
tar -tzf archive.tar.gz | sort -r | xargs -d '\n' rm -d
Explicação
Você pode obter uma lista dos arquivos em um arquivo tar.gz usando a opção -t
:
tar -tzf archive.tar.gz
Se houver a menor chance de haver caminhos absolutos no seu arquivo e você não descompactar usando a opção -P
para o tar (que descompactaria para os locais absolutos em vez do atual ou determinado diretório), você precisa remover as barras iniciais da lista de arquivos, porque tar -tf
sempre as mostrará. sed
pode ajudar com isso:
tar -tzf archive.tar.gz | sed 's@^//*@@'
Leva o padrão entre o primeiro e o segundo @
- ^//*
, que corresponde a um ou mais /
no início de uma linha, e o substitui pela sequência entre o segundo e o terceiro @
. neste caso sem nada, efetivamente removendo o jogo.
Com xargs
você pode a saída de um comando como argumentos para outro:
tar -tzf archive.tar.gz | sed 's@^//*@@' | xargs -d '\n' rm
Isso pega a lista de arquivos, delimitada por novas linhas ( -d '\n'
) e os passa para rm
. Isso excluirá qualquer arquivo. Como de costume, os diretórios não serão removidos e você receberá uma mensagem de erro para cada um.
Para obter também qualquer diretório criado pela descompactação anterior, você precisará usar rm -d
, que também excluirá os diretórios empty . A saída de tar -t
geralmente é ordenada alfabeticamente, o que significa que qualquer diretório será listado antes dos arquivos neles. Isso significaria que o diretório ainda não está vazio quando rm
tentar excluí-lo. Para evitar esse problema, usamos apenas sort -r
para reordenar a lista em ordem alfabética invertida. Dessa forma, qualquer arquivo em um diretório será excluído antes que rm
tente remover o próprio diretório.
tar -tzf archive.tar.gz | sed 's@^//*@@' sort -r | xargs -d '\n' rm -d
Os diretórios que contêm arquivos que não estão no arquivo (por exemplo, se o diretório já existia e continha arquivos antes de serem descompactados) não serão removidos. Por favor, não use rm -r
em vez de rm -d
, porque ele também pode excluir arquivos e diretórios que não estão no arquivo.