web-dev-qa-db-fra.com

Comment extraire le premier fichier à partir de fichiers cbz en un seul lot?

J'ai une collection de bandes dessinées que je stocke sur mon ordinateur, principalement au format .cbz (qui n'est qu'une archive Zip, mais avec un nom de fantaisie). Récemment, j'ai décidé de faire un collage des couvertures d'une série de bandes dessinées spécifique, pour laquelle j'aurais besoin du premier fichier des archives de bandes dessinées.

Voici la ventilation du problème:

  • 75 .cbz fichiers dans un seul dossier;
  • Chaque fichier a un nom tel que <series name> #<issue number>, où les numéros d'édition vont de 1 à 75 (un problème: ce n'est pas comme 01, 02, 03, etc., il peut donc y avoir une confusion avec le tri);
    • Chaque fichier à l'intérieur de chaque archive est nommé comme <issue name> <3-digit issue number with preceding zeros>
  • Les archives peuvent être renommées en .Zip si nécessaire, mais je sais que 7Zip (et quelques autres archiveurs, mais pas encore non) gère assez bien CBZ;

Ce dont j'ai besoin:

  • Le premier fichier de chacune des 75 archives. Les fichiers ont déjà des noms distinctifs, il n'est donc pas nécessaire de les renommer à la sortie.

Ce que j'ai:

  • Ubuntu 16.04
  • 7Zip
  • Connexion Internet

Comment puis-je y arriver? Quelle commande extraira le premier fichier de chaque archive d’un dossier dans le même dossier?

3
Gallifreyan

Si vous n'avez pas besoin de renommer les fichiers de sortie, je vous suggère quelque chose comme ceci:

#!/bin/bash

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

Enregistrez-le dans un fichier tel que script.sh et placez-le dans le même répertoire que vos bandes dessinées. Puis donnez-lui la permission d'exécution:

chmod +x script.sh

Et lancez-le:

./script.sh

Comment ça marche?

Nous pouvons obtenir une liste de tous les fichiers d’une archive Zip en utilisant zipinfo:

zipinfo -2 mycomic.cbz

il produit quelque chose de similaire à:

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

Ensuite, en utilisant awk 'NR==1 { print }', nous pouvons renvoyer le premier nom de fichier qui est: First file within the archive.jpg.

Maintenant, pour extraire ce fichier, je peux utiliser un unzip comme:

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