Descompacte o arquivo com um único arquivo e renomeie a saída para corresponder ao nome do arquivo

4

O objetivo é descompactar vários arquivos zip e renomear o arquivo resultante para o nome do arquivo original.

Considerando uma pasta com muitos arquivos zip, a maioria deles contém um arquivo chamado bla.txt , mas é claro que existem algumas exceções. Tudo o que se sabe é que todo arquivo tem um único arquivo, que é um arquivo txt.

./zips/
    a.zip - contains bla.txt
    b.zip - contains bla.txt
    c.zip - contains somethingelse.txt
    d.zip - contains bla.txt
    ...   - ...

saída deve ser

./zips/
    a.txt
    b.txt
    c.txt
    d.txt
    ...  

Melhor foto atual, que extrai tudo, mas me deixa com muitas pastas:

for z in *.zip; do unzip $z -d $(echo 'dir_'$z); done

talvez algo como

for z in *.zip; do unzip $z; mv 'content_name.txt' $z; done

Mas como é obtido o nome do conteúdo?

    
por Laurens Koppenol 28.07.2017 / 16:35

2 respostas

5

Você pode continuar com a ideia -d e simplesmente renomear qualquer arquivo extraído para o "nome do CEP menos o zip mais txt":

mkdir tmp
for f in *.zip; do unzip "$f" -d tmp && mv tmp/* "${f%.zip}.txt"; done
rmdir tmp

Como alternativa, você pode canalizar a saída do descompactador para o arquivo com o nome apropriado:

for f in *.zip; do unzip -p "$f" > "${f%.zip}.txt"; done
    
por 28.07.2017 / 18:01
1

O comando unzip tem sua própria opção unzip -Z1 zipfile.zip para mostrar o nome do arquivo compactado real no arquivo zipado, que está aceitando zipinfo's option -1 , pois é zipinfo -1 zipfile.zip . então você poderia simplesmente fazer como abaixo e não há necessidade de criar um diretório temporário e mv será feito no lugar no diretório atual.

for z in *.zip; do 
    unzip "$z";
    mv "$(unzip -Z1 $z)" "${z%%.*}.txt";
done
    
por 28.07.2017 / 18:20