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

Я собираюсь получить более 1000 файлов, которые нужно будет переименовать, чтобы имена содержали их размеры для печати. Я понял, как извлечь размеры в пикселях и переименовать файлы, чтобы включить их с помощью exiftool, но я не уверен, что лучше всего подходит для автоматизации вычисления пикселей в дюймы и последующего переименования.

Вот что делает exiftool:

exiftool '-filename<%f_h${ImageHeight}w${ImageWidth}r${XResolution}.${FileType}'

Таким образом, исходное имя файла 466001004_cc.jpg переименовывается в 466001004_cc_h5280w4080r120.jpg, и теперь мне нужно разделить 5280 и 4080 на 120, чтобы получить значения в дюймах.

В конечном итоге имя файла должно выглядеть так: 466001004_cc_044x034.jpg

Любая помощь будет принята с благодарностью, спасибо!


person Sam    schedule 29.01.2015    source источник
comment
К сожалению, нет, значения высоты, ширины и разрешения для каждого файла разные.   -  person Sam    schedule 29.01.2015
comment
Необходимый коэффициент преобразования точек на дюйм, к сожалению, зависит от конкретного устройства (камера, сканер, монитор, принтер ...), поэтому без привязки к конкретному устройству, которое захватило изображение или будет отображать его, преобразование в дюймы довольно бессмысленно. ..   -  person twalberg    schedule 30.01.2015
comment
Да, я согласен, и изначально был смущен запросом, но рассматриваемые изображения представляют собой текстильные узоры, которые будут отображены в C4D и уже имеют размер для их повторных значений в реальном мире.   -  person Sam    schedule 30.01.2015


Ответы (1)


# file looks like: 466001004_cc_h5280w4080r120.jpg
for file in *; do
    read basename w h <<< $(echo $file | awk -F_h '{print $1 " " $2}' | awk -Fr '{print $1}' | awk -Fw '{print $1 " " $2}')
    w=$(echo "$w 120 / p" | dc)
    h=$(echo "$h 120 / p" | dc)
    mv $file ${basename}_${w}x${h}.jpg
done

Я предполагаю, что единственный _h в имени файла был вставлен вами. Если это часть базового имени файла, мой сценарий сломается.

Я также предполагаю, что в имени файла нет пробелов (это нарушило бы команду «for»), и что не так много файлов, длина строки которых больше, чем Bash может обработать.

Легкий тест:

for file in *; do echo $file; done

... если он правильно сбрасывает все ваши имена файлов, все в порядке. Имея кучу файлов, вам нужно будет заменить for на что-то вроде

find . -name "*.jpg" | while read file; do
    file=$(basename $file)

... на самом деле, это довольно простое решение. Остальная часть сценария останется без изменений.

person Mike S    schedule 29.01.2015
comment
Большое спасибо! Я собираюсь попробовать это, когда вернусь в свой офис. И да, я вставил w, h и r, чтобы указать значения ширины, высоты и разрешения, их легко удалить. Пробелы тоже не проблема, исправить это в пределах моих ограниченных возможностей! - person Sam; 29.01.2015
comment
Если OP использует bash, вы можете выполнять деление, не прибегая к _2 _... w=600; ((x=w/120)); echo $x; 5 - person Mark Setchell; 30.01.2015
comment
Спасибо! Решение Майка сработало отлично, но я тоже попробую. - person Sam; 30.01.2015
comment
Вы должны отметить это как принятый ответ, если считаете, что он ответил на ваш вопрос. Спасибо. - person Mike S; 08.02.2015
comment
Спасибо @Mark Setchell. Я также отмечаю, что вы можете изменить значение переменной, используя технику Марка, без использования другой переменной. То есть w=600; ((w=w/120)); echo $w возвращает 5, как ожидалось. Пора отказаться от постоянного тока для целочисленной арифметики :-). - person Mike S; 18.05.2015