У меня есть коллекция комиксов, которые я храню на своем компьютере, в основном в .cbz
формате (это просто архив ZIP, но с причудливым названием). Недавно я решил сделать коллаж обложек определенной серии комиксов, для чего мне понадобится первый файл в архиве комиксов.
Вот описание проблемы:
- 75
.cbz
файлов в одной папке; - Каждый файл имеет имя вида
<series name> #<issue number>
, где номера выпусков идут от 1 до 75 (одна проблема: это не похоже на 01, 02, 03 и т. д., поэтому может возникнуть путаница с сортировкой);- Каждый файл внутри каждого архива имеет имя типа
<issue name> <3-digit issue number with preceding zeros>
- Каждый файл внутри каждого архива имеет имя типа
- При необходимости архивы можно переименовывать
.zip
, но я знаю, что 7Zip (и некоторые другие архиваторы, но не unrar) достаточно хорошо справляется с CBZ;
Что мне нужно:
- Первый файл из каждого из 75 архивов. Файлы уже имеют отличительные имена, поэтому нет необходимости переименовывать их на выходе.
Что у меня есть:
- Убунту 16.04
- 7Zip
- интернет-соединение
Как мне это сделать? Какая команда извлечет первый файл из каждого архива в папке в ту же папку?
решение1
Если вам не нужно переименовывать выходные файлы, то я предлагаю что-то вроде этого:
#!/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
Как это работает?
Мы можем получить список всех файлов в zip-архиве, используя zipinfo
:
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"