Como “desfazer” um “unzip” realizado no terminal / CLI?

5

Eu sei que isso é possível com um erro incompleto, embora eu não consiga lembrar o comando exato ... mas é possível "desfazer" um comando "unzip" recente, neste caso, usando o terminal mac?

Isso está usando /usr/bin/unzip em 10.7, com o UnZip 5.52.

Digamos que comecei com uma estrutura de pastas como essa ....

admin$ pwd
    /usr/local/src
admin$ ls
    pots            pans           scrubbers.zip
admin$ unzip scrubbers.zip
admin$ ls
    pots               pans           scrubbers.zip
    zebraturd.doc      README.md      morestuffididntmeantoputhere.py      cleanme.junkmail                 
    surfraw.2.html     scrubbers.explaination

como posso apenas "rezipar" ou analisar o arquivo zip ao contrário?

existe uma seção no arquivo zip que sorta lista os arquivos no arquivo, embora muito seriamente mutilada .. por exemplo ..

 0L'†C  0L'†C  !∏V≤B PK&Å‘:√@'¢îF3$ Lmacos/lib/libexiv2.2.1.0.dylib

sem peneirar manualmente essa lista, há uma mágica para isso?

    
por mralexgray 22.08.2011 / 13:12

4 respostas

5

A resposta de Iain causou um erro na minha máquina que eu não consegui descobrir ... então eu fui em frente e escrevi um pequeno script BASH que inclui parte de sua solução, e isso funciona muito bem ... apenas passe o zip original como um argumento para este script ununzip.sh . Comente a linha rm para pré-visualizar a "ação".

#!/bin/bash
COUNT=0                                   # USAGE:
PURGE=CLEAR                               # chmod +x ununzip.sh && ./ununzip.sh file.zip
THATDARNzip=$1                            # THIS IS YOUR file.zip, THE ARGUMENT
PURGE=('unzip -t THATDARNzip | awk '{print $2}' |  xargs echo')
COUNT=${#PURGE[@]}                        # HOW MUCH STUFF GOT UNZIPPED?
echo "total items "$COUNT
echo -e "item at 0 is ${PURGE[0]}"        # WE DON'T DELETE THE ORIGINAL ZIP FILE
while [ "$COUNT" -gt 0 ]; do
echo -e "deleting ${PURGE[${COUNT}]}"
rm -r "${PURGE[${COUNT}]}"                # COMMENT THIS LINE FOR A DRY RUN
COUNT=$[ $COUNT - 1 ]
done
exit 0
    
por 22.08.2011 / 14:19
10

Você poderia tentar

unzip -t zipfile.zip | awk '{print $2}' | tail -n +2 | xargs echo

ou

unzip -t zipfile.zip | awk '{print $2}' | sed 's/zipfile.zip//' | xargs echo

e se você tiver espaços em nomes de arquivos

unzip -l zipfile.zip | tail -n +4 | head -n -2 | awk '{print "\""substr($0,index($0,$4))"\""}' | xargs rm

verifique se a saída é sensata e altere echo para rm . Em particular, verifique se o seu arquivo zip não está listado na saída. Isso não é perfeito, pois deixará os diretórios intactos, mas pode ser mais fácil do que vasculhar tudo manualmente.

    
por 22.08.2011 / 13:30
3

Eu apenas excluo manualmente o lixo, enquanto me alerta enfaticamente para não verificar o arquivo zip que estava sensivelmente formado (o que eles invariavelmente não são) com unzip -l primeiro.

    
por 22.08.2011 / 13:15
3

Tente isto:

$ unzip -l scrubbers.zip | sed '1,3d' | sed 'N;$!P;$!D;$d' | awk '{ print $4 }' | xargs rm -fr
    
por 22.08.2011 / 13:47

Tags