Como extrair o primeiro arquivo de arquivos cbz em um lote?

Como extrair o primeiro arquivo de arquivos cbz em um lote?

Tenho uma coleção de histórias em quadrinhos que guardo no meu computador, a maioria em .cbzformato (que é apenas um arquivo ZIP, mas com um nome chique). Recentemente, resolvi fazer uma colagem das capas de uma série de quadrinhos específica, para a qual precisaria do primeiro arquivo do arquivo de quadrinhos.

Aqui está a análise do problema:

  • 75 .cbzarquivos em uma única pasta;
  • Cada arquivo tem um nome como <series name> #<issue number>, onde os números dos problemas vão de 1 a 75 (um problema: não é como 01, 02, 03, etc, então pode haver confusão com a classificação);
    • Cada arquivo dentro de cada arquivo é nomeado como<issue name> <3-digit issue number with preceding zeros>
  • Os arquivos podem ser renomeados .zipse necessário, mas sei que o 7Zip (e alguns outros arquivadores, mas não unrar) lida com CBZ bem o suficiente;

O que eu preciso:

  • O primeiro arquivo de cada um dos 75 arquivos. Os arquivos já possuem nomes distintos, portanto não há necessidade de renomeá-los na saída.

O que eu tenho:

  • Ubuntu 16.04
  • 7Zip
  • conexão de internet

Como faço para que isso aconteça? Qual comando extrairá o primeiro arquivo de cada arquivo em uma pasta para a mesma pasta?

Responder1

Se você não precisar renomear os arquivos de saída, sugiro algo assim:

#!/bin/bash

for file in *.cbz
do
 cover="`zipinfo -2 "$file" | awk 'NR==2 {exit} 1'`"
 unzip -j "$file" "$cover"
done;

Salve-o em um arquivo como script.she coloque-o no mesmo diretório dos seus quadrinhos. Em seguida, dê permissão de execução:

chmod +x script.sh

E execute:

./script.sh

Como funciona?

Podemos obter uma lista de todos os arquivos dentro de um arquivo zip usando zipinfo:

zipinfo -2 mycomic.cbz

gera algo semelhante a:

First file within the archive.jpg
Second file within the archive.jpg
...

Então, usando awk 'NR==1 { print }'podemos retornar o primeiro nome do arquivo que é: First file within the archive.jpg.

Agora, para extrair este arquivo, posso usar um unziplike:

unzip -j mycomic.cbz "First file within the archive.jpg"

informação relacionada