如何批量从cbz文件中提取第一个文件?

Gal*_*yan 3 command-line archive files batch

我在我的电脑上存储了一系列漫画书,主要是.cbz格式(这只是一个 ZIP 档案,但有一个花哨的名字)。最近,我决定制作一个特定漫画系列封面的拼贴画,为此我需要漫画书档案中的第一个文件。

这是问题的细分:

  • .cbz单个文件夹中有75个文件;
  • 每个文件都有一个类似的名称<series name> #<issue number>,其中问题编号从 1 到 75(一个问题:它不像 01、02、03 等,因此在那里排序可能会造成混淆);
    • 每个存档中的每个文件都命名为 <issue name> <3-digit issue number with preceding zeros>
  • .zip如有必要,档案可以重命名,但我知道 7Zip(和其他一些档案,但不是 unrar)可以很好地处理 CBZ;

我需要的:

  • 75 个档案中的第一个档案。这些文件已经具有独特的名称,因此无需在输出时重命名它们。

我拥有的:

  • Ubuntu 16.04
  • 7邮编
  • 网络连接

我该如何做到这一点?什么命令会将文件夹中每个存档中的第一个文件提取到同一文件夹?

Rav*_*ina 5

如果您不需要重命名输出文件,那么我建议如下:

#!/bin/bash

for file in *.cbz
do
 cover="`zipinfo -2 "$file" | awk 'NR==2 {exit} 1'`"
 unzip -j "$file" "$cover"
done;
Run Code Online (Sandbox Code Playgroud)

将其保存在一个类似的文件中script.sh,并将其放入与您的漫画相同的目录中。然后给它执行权限:

chmod +x script.sh
Run Code Online (Sandbox Code Playgroud)

并运行它:

./script.sh
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?

我们可以使用以下命令获取 zip 存档中所有文件的列表zipinfo

zipinfo -2 mycomic.cbz
Run Code Online (Sandbox Code Playgroud)

它输出类似于:

First file within the archive.jpg
Second file within the archive.jpg
...
Run Code Online (Sandbox Code Playgroud)

然后使用awk 'NR==1 { print }'我们可以返回第一个文件名,即:First file within the archive.jpg.

现在要提取这个文件,我可以使用unzip类似的:

unzip -j mycomic.cbz "First file within the archive.jpg"
Run Code Online (Sandbox Code Playgroud)