Добавление проверки состояния (целостности файла) в сценарий конвертации cbr cbz bash

Первый пост, так что привет! Начну с того, что я полный нуб в программировании. Я понимаю очень простые вещи, но когда дело доходит до проверки кодов выхода или подходящего термина, я теряюсь. Видимо, мой searchfoo действительно слаб в этой области, я думаю, это вопрос терминологии.

Заранее спасибо, что нашли время прочитать это/ответить на мой вопрос!

Описание: я нашел ссылку скрипт, который конвертирует/переупаковывает файлы .cbr в файлы .cbz. Эти файлы в основном являются вашими обычными rar и zip, однако переименованные в другое расширение, поскольку они используются для приложений (комиксов)книг, таких как comicrack, qcomicbook и не только. Удивительно, но конвертеров cbr -> cbz нет. Преимущество .cbz заключается не только в том, что он не использует проприетарный формат файла rar, но и в том, что метаданные можно хранить из . Comic Vine с e. g comictagger.

Проблема. Иногда переупаковка файлов заканчивается плохо, и мы надеемся, что это можно исправить, проверив целостность и повторив попытку. Я немного изменил этот скрипт, чтобы использовать p7zip, так как он может как упаковывать, так и распаковывать 7z, zip-файлы и некоторые другие, т.е. е отлично подходит для вариантов. p7zip может протестировать архив следующим образом:

7z t comicfile.cbz tmpworkingdir

Я предполагаю, что это вопрос использования if & else здесь (?), чтобы проверить целостность, а затем повторить попытку, если есть какие-либо ошибки.

Вопрос/tl;dr: Каким будет «лучший»/адекватный подход для добавления проверки целостности файла в приведенный ниже сценарий?

#!/bin/bash
#Source: http://comicrack.cyolito.com/forum/13-scripts/30013-cbr3cbz-rar-to-zip-conversion-for-linux
echo "Converting CBRs to CBZs"

# Set the "field separator" to something other than spaces/newlines" so that spaces
# in the file names don't mess things up. I'm using the pipe symbol ("|") as it is very
# unlikely to appear in a file name.
IFS="|"

# Set working directory where to create the temp dir. The user you are using must have permission
# to write into this directory.
# For performance reasons I'm using ram disk (/dev/shm/) in Ubuntu server.
WORKDIR="/dev/shm/"

# Set name for the temp dir. This directory will be created under WORDDIR
TEMPDIR="cbr2cbz"

# The script should be invoked as "cbr2cbz {directory}", where "{directory}" is the
# top-level directory to be searched. Just to be paranoid, if no directory is specified,
# then default to the current working directory ("."). Let's put the name of the
# directory into a shell variable called SOURCEDIR.
# Note: "$1" = "The first command line argument"
if test -z "$1"; then
        SOURCEDIR=`pwd`
else
        SOURCEDIR="$1"
fi

echo "Working from directory $SOURCEDIR"

# We need an empty directory to work in, so we'll create a temp directory here
cd "$WORKDIR"
mkdir "$TEMPDIR"
# and step into it
cd "$TEMPDIR"

# Now, execute a loop, based on a "find" command in the specified directory. The
# "-printf "$p|" will cause the file names to be separated by the pipe symbol, rather than
# the default newline. Note the backtics ("`") (the key above the tab key on US
# keyboards).
for CBRFILE in `find "$SOURCEDIR" -name "*.cbr" -printf "%p|while read line; do

    # Now for the actual work. First, extract the base file name (without the extension)
    # using the "basename" command. Warning: more backtics.
    BASENAME=`basename $CBRFILE ".cbr"`

    # And the directory path for that file, so we know where to put the finished ".cbz"
    # file.
    DIRNAME=`dirname $CBRFILE`

    # Now, build the "new" file name,
    NEWNAME="$BASENAME.cbz"

    # We use RAR file's name to create folder for unpacked files
    echo "Processing $CBRFILE"
    mkdir "$BASENAME"
    # and unpack the rar file into it
    7z x "$CBRFILE" -O"$BASENAME"
    cd "$BASENAME"

    # Lets ensure the permissions allow us to pack everything
    sudo chmod 777 -R ./*

# Put all the extracted files into new ".cbz" file
    7z a -tzip -mx=9 "$NEWNAME" *

    # And move it to the directory where we found the original ".cbr" file
    mv "$NEWNAME" $DIRNAME/"$NEWNAME"

    # Finally, "cd" back to the original working directory, and delete the temp directory
    # created earlier.
    cd ..
    rm -r "$BASENAME"

    # Delete the RAR file also
    rm "$CBRFILE"

done

# At the end we cleanup by removing the temp folder from ram disk
cd ..
echo "Conversion Done"
rm -r "$TEMPDIR"

О, человечество, не публиковать более двух ссылок до 10 репутации, и я связал дерьмо из ОП.

[edit 2] Я удалил unrar как зависимость и вместо этого использовал p7zip, так как он может извлекать rar-файлы.


person danielpublic    schedule 27.02.2013    source источник
comment
+1 поможет вам наполовину преодолеть ограничение на ссылки (и я надеюсь, что вы сохранили старую версию, чтобы вы могли обновить свой пост позже).   -  person unthought    schedule 27.02.2013
comment
Для начала вы должны указать $SOURCEDIR (в команде поиска), так как он может содержать пробелы. $TEMPDIR и $WORKDIR лучше указывать в кавычках (хотя вы сами их задаете). Удалите пробелы до и после = в WORKDIR = "/dev/shm/". Это должно WORKDIR="/dev/shm/". Также процитируйте $1 в test -z $1. Также не анализируйте find. Вместо этого используйте цикл while, как в find ..... | while read line; do   -  person user000001    schedule 27.02.2013
comment
@ user000001 Спасибо! Хотя я, кажется, получаю следующие ошибки после того, как ваши предложения видят сценарий в OP (N.B. Это вполне может быть следствием моего нубства). /usr/local/bin/cbr2cbzTEST: строка 49: неожиданный конец файла при поиске соответствия ``' /usr/local/bin/cbr2cbzTEST: строка 84: синтаксическая ошибка: неожиданный конец файла   -  person danielpublic    schedule 27.02.2013
comment
@danielpublic Вы неправильно поняли мой комментарий. for больше не нужен. Вся строка должна быть find "$SOURCEDIR" -name "*.cbr" | while read CBRFILE; do. При этом также нет необходимости устанавливать IFS. Он будет обрабатывать все символы в имени файла (кроме символа новой строки '\n', который в любом случае не следует использовать)   -  person user000001    schedule 27.02.2013


Ответы (1)


Вам понадобятся два чека:

  1. 7z t проверит целостность архива
  2. Вы также должны проверить целостность всех файлов изображений в архиве. Для этого вы можете использовать такие инструменты, как ImageMagick.

    Простым тестом будет identify файл, но он может читать только заголовок. Я бы использовал convert файл -resize 5x5 png:- > /dev/null

    Это уменьшает изображение до 5x5 пикселей, преобразует его в PNG, а затем передает результат в /dev/null (отбрасывая его). Для масштабирования необходимо прочитать все изображение. Если эта команда завершается с ошибкой, что-то не так с файлом изображения.

person Aaron Digulla    schedule 27.02.2013