Обратное сопоставление с exiftool

Я сортирую изображения на основе содержимого псевдотега subject тега exiftool, который обычно выглядит примерно так:

15: D101-5-12 1: Elephas maximus 16: Bob

Обычно я сортирую изображения по названию вида во второй строке, однако для некоторых изображений вторая строка отсутствует, и я хотел бы отфильтровать эти изображения.

Первая и третья строки сильно различаются между изображениями, поэтому я не могу их использовать. Вместо этого я пробовал различные методы «обратного сопоставления», предложенные по другим вопросам, связанным с этой темой, но безуспешно. Например, следующее не работает:

exiftool -r -if '\$subject=~/^((?!1:\s).)*$/i' \
'-Filename=./image_sorted/%f%+c%E' image_directory

Любые идеи о том, как это сделать с exiftool?


person Philipp HB    schedule 25.05.2018    source источник


Ответы (1)


Теперь, когда я понимаю, что все ключевые слова ваших видов начинаются с 1:, я думаю, что могу сделать для вас лучшую команду «все в одной».

exiftool -r '-Filename=./image_sorted/%f%+c%E' '-Filename<./${Subject;$_=undef if not s/.*(?:^|, )1: (.*?)(,|$).*/$1/}/%f%+c%E' ./image_directory/

Эта команда переместит любой файл, у которого нет ключевого слова, начинающегося с 1:, в каталог image_sorted. Если у него есть ключевое слово, начинающееся с 1:, он переместит его в каталог, основанный на названии вида, и это переопределит предыдущую опцию, чтобы переместить его в каталог image_sorted.

Эта команда выдаст предупреждение Warning: [minor] Tag 'Subject' not defined и Warning: No writable tags set для любого файла, для которого не задано ключевое слово 1: Species Name. Их можно безопасно игнорировать, и вы можете полностью избежать их, добавив опцию -m.

person StarGeek    schedule 25.05.2018
comment
Технически это не отвечает на этот вопрос, но я думаю, что он лучше достигает вашей первоначальной цели. - person StarGeek; 25.05.2018
comment
Во-первых, это гениально! Большое спасибо. Во-вторых, взаимозаменяемы ли < и = в exiftool? И, наконец, я считаю, что вам не хватает исходного каталога в конце. - person Philipp HB; 25.05.2018
comment
Нет, знаки </> и = не взаимозаменяемы. Это распространенная ошибка №5c, и я много проблем с и до сих пор иногда испортить. Знак равенства = используется для присвоения статического значения тегу. Знаки больше/меньше </> используются для копирования тега в другой тег. Вы можете добавить статические данные при копировании тега, но не можете скопировать тег со знаком равенства. Да, я оставил каталог отключенным, потому что мне было лень, я добавлю его. Убедитесь и протестируйте команду, но она должна работать нормально для вас. - person StarGeek; 26.05.2018
comment
Чтобы решить проблему с вашим регулярным выражением, оно соответствует нулю или более вхождений 1: , за которыми следует еще один любой другой символ. Так что это будет соответствовать 1: a1: b1: c и т. д. Кроме того, вам нужно, чтобы совпадение было в начале строки, но $subject — это строка, объединяющая все ключевые слова, и невозможно сказать, в каком порядке они могут быть. Более правильное совпадение было бы -if '$Subject!~/(?:^|, )1: .*?(?:, |$) - person StarGeek; 26.05.2018
comment
Последнее предупреждение: если в названии вида есть запятая, команда возьмет только часть имени до запятой. Если это так, то можно что-то изменить, чтобы приспособиться к этому. - person StarGeek; 26.05.2018
comment
Спасибо за очень полезные пояснения! К сожалению, я столкнулся с проблемой при попытке сохранить изображения без вида в подкаталог. Может лучше сформулировать другой вопрос, но -Filename=../Data/image_sorted/Empty/%f%+c%E хранит картинку не в каталоге Empty, а в каталоге image_sorted. Любые идеи? - person Philipp HB; 29.05.2018
comment
Этого не должно быть, если в данных нет чего-то, что мне не хватает. Возможно, сообщите о проблеме на форумах exiftool, где вы можете опубликовать более подробную информацию и, возможно, пример изображения? Кроме того, он получает еще несколько взглядов на проблему. - person StarGeek; 29.05.2018