Как я проверяю, являются ли все файлы в каталогах допустимым jpegs (Linux, sh необходимый сценарий)?

Хорошо, я получил каталог (например, названный '/photos' '), в котором существуют различные каталоги (как '/photos/wedding', '/photos/birthday ', '/photos/graduation', и т.д....), которые имеют .jpg файлы в них. К сожалению, некоторые jpeg файлы повреждаются. Я должен найти путь, как определить, какие файлы повреждаются. Я узнал, что существует инструмент, названный imagemagic, который может помочь много. Если Вы используете его как это:

identify -format '%f' whatever.jpg

это печатает название файла, только если файл является правильным, если это не это, печатает что-то как, "определите: Не файл JPEG: запускается с 0x69 0x75 `whatever.jpg' jpeg.c/EmitMessage/232. ". Таким образом, правильное решение должно быть находкой все файлы, заканчивающиеся" .jpg", относятся их, "определяют", и если результатом является просто название файла - ничего не делают, и если результат отличается от названия файла - затем сохраняют название файла somethere (как в файле "errors.txt").

Какие-либо идеи, как я могу, вероятно, сделать это?

9
задан Graf 4 June 2010 в 12:58
поделиться

2 ответа

Вы можете поместить это в файл сценария bash или запустить напрямую:

find -name "*.jpg" -type f |xargs --no-run-if-empty identify -format '%f' 1>ok.txt 2>errors.txt

Если identify отсутствует, вот как установить его в Ubuntu: sudo apt install imagemagick --no-install-recommends

9
ответ дан 4 December 2019 в 06:40
поделиться

Этот сценарий распечатает имена плохих файлов:

#!/bin/bash

find /photos -name '*.jpg' | while read FILE; do
    if [[ $(identify -format '%f' "$FILE" 2>/dev/null) != $FILE ]]; then
        echo "$FILE"
    fi
done

Вы можете запустить его как есть или как ./ badjpegs> errors.txt , чтобы сохранить вывод в файл.

Чтобы разбить его, команда find находит файлы * .jpg в / photos или в любом из его подкаталогов. Эти имена файлов передаются в цикл while, который считывает их по одному в переменную $ FILE . Внутри цикла мы получаем вывод identify с помощью оператора $ (...) и проверяем, соответствует ли он имени файла. В противном случае файл плохой, и мы печатаем имя файла.

Возможно, это можно упростить. Большинство команд UNIX указывают в коде выхода на успех или сбой.Если это делает команда identify , вы можете упростить сценарий до:

#!/bin/bash

find /photos -name '*.jpg' | while read FILE; do
    if ! identify "$FILE" &> /dev/null; then
        echo "$FILE"
    fi  
done

Здесь условие упрощается до if! идентифицировать; затем , что означает «не удалось идентифицировать ошибку?»

2
ответ дан 4 December 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: