Хорошо, я получил каталог (например, названный '/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").
Какие-либо идеи, как я могу, вероятно, сделать это?
Вы можете поместить это в файл сценария 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
Этот сценарий распечатает имена плохих файлов:
#!/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! идентифицировать; затем
, что означает «не удалось идентифицировать ошибку?»