Acabei de desarmar um arquivo que produziu uma bagunça de arquivos no meu diretório arrumado. Por exemplo:
user@comp:~/tidy$ tar xvf myarchive.tar
file1
file2
dir1/
dir1/file1
dir1/subdir1/
dir1/subdir1/file1
dir2/
dir2/file1
...
Eu estava esperando que o arquivo tar fosse organizado em uma única pasta (ou seja myarchive/
), mas não era! Agora, tenho 190 arquivos e diretórios que vomitaram digitalmente o que era um diretório organizado. Esses arquivos não identificados precisam ser limpos.
Existe alguma maneira de "desfazer" isso e excluir os arquivos e diretórios que foram extraídos deste arquivo?
Obrigado pelas excelentes respostas abaixo. Em resumo , aqui está o que funciona com duas etapas (1) excluir arquivos e (2) excluir a estrutura de diretórios vazia na ordem inversa de compactação (para excluir primeiro os diretórios externos):
tar tf myarchive.tar | xargs -d'\n' rm
tar tf myarchive.tar | tac | xargs -d'\n' rmdir
E ainda mais seguro, para visualizar uma execução a seco dos comandos anexando echo
depois xargs
.
xargs
(emtac
vez desort -r
apenas cosméticos), mas aceita a resposta com substituição de processo que, como explicado nos comentários, não se encaixava em você? Além disso, indique axargs -d'\n'
opção em sua postagem se você quiser resumir para futuros usuários, para que eles não sejam mordidos por espaços nos nomes dos arquivos.-d'\n'
até agora e, após uma análise mais aprofundada, sua resposta está realmente mais próxima do que eu usei.-d'\n'
reside no fato de que, se você não disserxargs
para dividir argumentos em novas linhas (que é o que você está alimentando), mas em espaços, um arquivo com o O nomefolder1/some file
será lido comofolder1/some
ename
.Respostas:
irá listar o conteúdo linha por linha.
Isso pode ser canalizado
xargs
diretamente, mas cuidado : faça a exclusão com muito cuidado. Você não quer apenasrm -r
tudo o quetar tf
lhe diz, pois pode incluir diretórios que não estavam vazios antes de descompactar!Você poderia fazer
para remover primeiro todos os arquivos que estavam no arquivo morto e, em seguida, os diretórios deixados em branco.
sort -r
(glennjackman sugeriu, emtac
vez desort -r
nos comentários da resposta aceita, que também funciona, já quetar
a saída é regular o suficiente) é necessária para excluir os diretórios mais profundos primeiro; caso contrário, um caso em quedir1
contém um único diretório vaziodir2
sairádir1
após armdir
passagem, desde que foi não esvaziar antesdir2
foi removido.Isso irá gerar muitos
e
Cale a boca com
2>/dev/null
isso, se isso o incomoda, mas eu preferiria manter o máximo de informações possível sobre o processo.E não faça isso até ter certeza de que corresponde aos arquivos corretos. E talvez tente
rm -i
confirmar tudo. E faça backups, tome seu café da manhã, escove os dentes, etc.fonte
-d'\n'
opção paraxargs
.xargs
não tem-d
, então você precisa da variante GNU se você é uma alma pobre como eu.Liste o conteúdo do arquivo tar da seguinte maneira:
Em seguida, exclua esses nomes de arquivos iterando sobre essa lista:
Isso ainda listará apenas os arquivos que seriam excluídos. Substitua
echo
porrm
se tiver certeza de que esses são os que você deseja remover. E talvez faça um backup para ter certeza.Em uma segunda passagem, remova os diretórios restantes:
Isso evita que os diretórios sejam excluídos, se eles já existiam antes.
Outro truque legal do @glennjackman, que preserva a ordem dos arquivos, começando pelos mais profundos. Mais uma vez, remova
echo
quando terminar.Isso pode ser seguido pela
rmdir
limpeza normal .fonte
while
loop sobre um conjunto de registros. Acostumei-me a isso. @ stérm -rf
poderia excluir arquivos que não eram do arquivo morto, mas dentro de um diretório com o mesmo nome que um arquivo. Melhor ter cuidado aqui e usarrmdir
em um segundo passe.rmdir
precisa ser executada para cada nível de aninhamento de diretórios. Portanto, ele será limposubdir1
na primeira passagem, mas saia,dir1
pois tentou excluir essa primeira vez quando não estava vazia no momento. Este comando pode ser feito uma vez se a lista de arquivos puder ser classificada inversamente.tar tvf arch.tar | tac | xargs echo rm
(remover o eco quando você está confiante)Aqui está uma possibilidade que pega os arquivos extraídos e os move para um subdiretório, limpando sua pasta principal.
Salve isso no arquivo
fix-tar.pl
e execute-o assim:Isso confirmará que sua
tar
lista é como a minha. Você deve obter uma saída como:Se isso parecer bom, execute-o novamente assim:
O
fixup.sh
script serão os comandos do shell que moverão os arquivos e diretórios de nível superior para uma pasta "limpa" (nesse caso, a pasta chamadacleanup
). Dê uma olhada neste script para confirmar que é tudo kosher. Se for, agora você pode limpar sua bagunça com:Prefiro esse tipo de limpeza porque não destrói nada que ainda não foi destruído por ser substituído por essa inicial
tar xv
.Nota: se essa saída inicial de operação a seco não parecer correta, você poderá mexer nos números das duas
substr
chamadas de função até que pareçam adequadas. A$perms
variável é usada apenas para a execução a seco; portanto, apenas a$dirent
substring precisa ser adequada.Outra coisa: você pode precisar usar a
tar
opção--numeric-owner
se os nomes de usuário e / ou grupos natar
lista fizerem os nomes começarem em uma coluna imprevisível.fonte
Esse tipo de arquivo (anti-social) é chamado de bomba de alcatrão por causa do que faz. Depois que uma dessas "explode" em você, as soluções nas outras respostas são muito melhores do que o que eu teria sugerido.
A melhor "solução", no entanto, é evitar o problema em primeiro lugar.
A maneira mais fácil (mais preguiçosa) de fazer isso é sempre descompactar um arquivo tar em um diretório vazio. Se incluir um diretório de nível superior, basta movê-lo para o destino desejado. Caso contrário, renomeie seu diretório de trabalho (o que estava vazio) e mova-o para o local desejado.
Se você quiser acertar da primeira vez, execute tar -tvf archive-file.tar | menos e listará o conteúdo do arquivo, para que você possa ver como ele está estruturado e, em seguida, faça o necessário para extraí-lo para o local desejado.
A opção t também é útil se você deseja inspecionar o conteúdo de um arquivo apenas para ver se ele tem algo que você está procurando. Nesse caso, você pode, opcionalmente, apenas extrair o (s) arquivo (s) que deseja.
fonte