Como deletar todos os arquivos da pasta que existe no arquivo tar.gz

0

Um erro típico para mim é a exctração no diretório errado.

Depois que eu percebi isso, eu quero excluir todo esse arquivo e extrair novamente.

Mas como automatizar essa operação delete-all-this-crap?

Alguma sugestão?

UPD: máquina linux (zsh)

    
por Korjavin Ivan 17.02.2015 / 11:12

1 resposta

1

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.

    
por 19.02.2015 / 15:03