Перемещение изображений на основе метаданных IPTC в bash

Я пытаюсь реорганизовать изображения на основе видов, которые находятся внутри изображения. Среди прочего, название вида можно найти в метаданных IPTC (см. ссылку на изображение инспектора< /а>). Я пытаюсь сделать это в bash на macOS и пробовал следующий код (с именем и каталогом вида шаблона):

find . -iname "*.jpg" -print0 | xargs -0 grep -l "Species Name" | xargs -0 -I {} mv {} ~/example/directory

Я также пытался использовать пакет exiftool, где соответствующая информация находится в теге Subject:

find . -iname "*.jpg" -print0 | xargs -0 exiftool -Subject | grep "Species Name" | xargs -0 -I {} mv {} ~/example/directory

Однако я получаю следующее сообщение об ошибке, которое, как я полагаю, является результатом неправильного использования grep или последнего xargs:

mv: rename (standard input) to ~/example/directory(standard input) : No such file or directory

Любые идеи, что может решить эту проблему? Заранее спасибо.


person Philipp HB    schedule 21.05.2018    source источник
comment
Слова Species Name не отображаются в метаданных, которые вы показываете....   -  person Mark Setchell    schedule 22.05.2018
comment
Название вида в показанных метаданных — «Малайский дикобраз». В зависимости от видов, присутствующих на изображении, это будет меняться.   -  person Philipp HB    schedule 22.05.2018


Ответы (2)


Exiftool может перемещать и переименовывать файлы на основе метаданных файла, и гораздо быстрее вызывает его один раз для всего каталога, чем индивидуально для каждого файла в цикле (Распространенная ошибка №3).

Думаю, вы могли бы использовать эту команду для сортировки:
exiftool -if '$subject=~/Species Name/i' -directory=~/example/directory .

Разбивка:
-if '$subject=~/Species Name/i' Выполняет регулярное сравнение тега Subject для "Названия вида". Я добавил i в конце, чтобы сделать сравнение нечувствительным к регистру, изменить по желанию.
-directory=~/example/directory Если условие -if выполнено, то файл будет перемещен в указанный каталог.

person StarGeek    schedule 21.05.2018
comment
После запуска предложенного кода я получаю следующее сообщение 1 directories scanned; 503 files failed condition; 0 image files read, а запуск кода с флагом -v2 ​​указывает на наличие синтаксической ошибки. Я пробовал другие варианты, такие как exiftool -if "${Keywords//[[:blank:]]/} =~ \W*MalayanPorcupine\W*\i" -directory=~/Desktop/image_data/malayan_porcupine ., но это тоже не работает. Любые идеи? - person Philipp HB; 22.05.2018
comment
Извините моя ошибка. Измените двойные кавычки на одинарные, чтобы bash не интерпретировал знак доллара как начало переменной оболочки. Кроме того, проверьте, какой тег вы действительно хотите использовать. Вы упомянули Subject в своем исходном сообщении, где ключевые слова будут расположены в XMP (IPTC Core), но Keywords в вашем комментарии (IPTC Legacy). - person StarGeek; 22.05.2018
comment
Работает как шарм! Спасибо. Стоит отметить, что я добавил флаг -r и изменил . для каталога, так как это должно будет обрабатывать файлы в подкаталогах. - person Philipp HB; 22.05.2018

Похоже, что выходная новая строка grep мешает этому, поскольку вы используете чистый конвейер -0, вы должны сделать это с grep - в Linux это будет grep -Z ... (или --null), не знаю, есть ли аналогичный в Mac OS.

person jjo    schedule 21.05.2018
comment
Спасибо за ответ! К сожалению, это не помогло. Однако я заметил, что grep не возвращает никаких путей даже с флагами -l и/или -Z. Вместо этого он возвращает (standard input). Какие-либо предложения? - person Philipp HB; 21.05.2018
comment
Какой греп? Тот, что в вашей первой команде, должен печатать каждое имя файла, так как ему передается список имен файлов с помощью xargs, тот, что в вашей второй команде, должен печатать стандартный ввод, так как он получает ввод из канала. - person Ed Morton; 22.05.2018