Rezipar arquivo sem criar provisórios

0

Talvez seja melhor começar com o caso de uso.
Eu tenho um grande arquivo zip cheio de muitos arquivos e eu suspeito que foi originalmente compactado em um nível baixo de compactação.

Eu quero criar um novo arquivo zip a partir daquele (ou não novo, esperançosamente no local) para ter certeza de que ele está bem compactado ( -9 ) sem descompactá-lo no disco primeiro (por várias razões, como tamanho e sendo um NFS montado). Então, enquanto eu poderia apenas fazer

mkdir tmp/ && unzip -d tmp/ A.zip && cd tmp/ && zip -r -9 ../B.zip *; rm -rf tmp/ A.zip

Isso criaria [temporariamente] uma enorme quantidade de dados (os arquivos descompactados e B.zip passam a existir antes que A.zip seja removido).
Eu realmente quero algo ao longo das linhas:

rezip -9 A.zip

ou, estabelecendo um B.zip :

unzip -<output to stdout> A.zip | zip -9 B.zip && rm -f A.zip

Mas percebo que isso não seria realmente possível, já que o pipe seria usado para vários arquivos e coisas como nomes de arquivos seriam perdidos.

Então, estou pensando se há uma maneira de executar algum código em cada arquivo, como find -exec <command>

unzip A.zip -exec zip -r B.zip && rm -f A.zip

Mas, novamente, não tem certeza de como isso funcionaria ou, se isso não for facilitado por unzip / zip , se existe um comando que o faça.

Eu incluí minha resposta atual, ainda com o uso de arquivos individuais, como uma resposta, pois pode ajudar alguém, embora não seja aceito, já que não responde à pergunta de nenhum temporário permitido

    
por Hashbrown 29.06.2016 / 05:44

1 resposta

0

Isso é o mais perto que pude chegar

zipinfo -1 A.zip | 
xargs -l sh -c '
    unzip A.zip "$0" &&
    zip -9 A.zip "$0"; 
    rm -f "$0"
'

Que sempre cria um arquivo tmp para cada arquivo no zip de cada vez.
Se eu puder encontrar uma maneira de zipar de stdin e passar um nome de arquivo, poderei usar o -p de unzip para usar pipes em todo o caminho.

zipinfo -1 A.zip | 
xargs -l sh -c '
    unzip -p A.zip "$0" | 
    zip -9 A.zip -<use this filename> "$0"
'

Mas está se mostrando difícil

    
por 29.06.2016 / 05:44