web-dev-qa-db-ja.com

1つのバッチでcbzファイルから最初のファイルを抽出する方法は?

主に.cbzフォーマット(単なるZipアーカイブですが、派手な名前が付いています)で、コンピュータに保存するコミックのコレクションがあります。最近、特定のコミックシリーズの表紙のコラージュを作成することにしました。そのためには、コミックブックアーカイブの最初のファイルが必要です。

問題の内訳は次のとおりです。

  • 単一フォルダー内の75 .cbzファイル。
  • 各ファイルには<series name> #<issue number>のような名前があり、問題番号は1から75になります(1つの問題:01、02、03などではないので、そこでのソートに混乱があるかもしれません);
    • 各アーカイブ内の各ファイルには、<issue name> <3-digit issue number with preceding zeros>のような名前が付けられます
  • 必要に応じてアーカイブの名前を.Zipに変更できますが、7Zip(および他のアーカイバではなく、unrarではない)がCBZを十分に処理することを知っています。

必要なもの:

  • 75個のアーカイブのそれぞれからの最初のファイル。ファイルにはすでに固有の名前が付けられているため、出力時に名前を変更する必要はありません。

私が持っているもの:

  • Ubuntu 16.04
  • 7Zip
  • インターネット接続

どうすればこれを実現できますか?フォルダー内のすべてのアーカイブから同じフォルダーに最初のファイルを抽出するコマンドは何ですか?

3
Gallifreyan

出力ファイルの名前を変更する必要がない場合は、次のようなものをお勧めします。

#!/bin/bash

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

script.shなどのファイルに保存し、コミックと同じディレクトリに配置します。次に、実行権限を付与します。

chmod +x script.sh

そしてそれを実行します:

./script.sh

どのように機能しますか?

zipinfoを使用して、Zipアーカイブ内のすべてのファイルのリストを取得できます。

zipinfo -2 mycomic.cbz

次のようなものを出力します。

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

次に、awk 'NR==1 { print }'を使用して、First file within the archive.jpgという最初のファイル名を返すことができます。

このファイルを抽出するには、次のようなunzipを使用できます。

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