Как анализировать метки времени EXIF ​​с помощью Bash-скрипта - PullRequest
5 голосов
/ 31 августа 2010

Будучи новичком в bash-скрипте, хотелось бы получить подробные ответы. :)

Я пытаюсь написать сценарий bash, который анализирует выходные метки времени JPEG EXIF ​​из утилиты commivline exiv2, которая выдает мне типичный вывод, например:

Метка времени изображения: 2010: 07: 27 17: 38: 52

Есть ли способ проанализировать отметку времени так, чтобы ее компоненты, такие как год, месяц, день, час, минута, секунда, вошли в соответствующие переменные?

Будет ли sed / gawk подходить? Если так, то как? Или какой-то другой способ лучше?

Таким образом, я могу манипулировать или смешивать и сопоставлять их так, как мне нравится.

Вот сценарий, который я получил до сих пор:

#!/bin/bash

COUNT=0
SKIPPED=0
FILES=0 # number of files encountered

# declare variables for time stamp

YEAR=0
MONTH=0
DAY=0

HOUR=0
MINUTE=0
SECOND=0

for CURRENT_FILE in * # a for loop to go through all files in current directory
do
    if [ -f "$CURRENT_FILE" ] # see if CURRENT_FILE is a file
    then
        FILETYPE=$(file -b --mime-type "$CURRENT_FILE") # get file type
        if [[ $FILETYPE == image/jpeg ]] # see if CURRENT_FILE's mime is image/jpeg
        then
            ((COUNT++))
            echo "Processing file $COUNT: $CURRENT_FILE"
            exiv2 "$CURRENT_FILE" | grep timestamp >> list
        else
            ((SKIPPED++))
            echo "Skipping file $CURRENT_FILE....."
        fi
        ((FILES++))
    fi
done

echo "Encountered $FILES files"
echo "Processed $COUNT files"
echo "Skipped $SKIPPED files"

Спасибо!

Ответы [ 2 ]

6 голосов
/ 31 августа 2010

Вот чистое решение bash для разделения строки спецификации метки времени:

SPEC='Image timestamp : 2010:07:27 17:38:52'
read X X YEAR MONTH DAY HOUR MINUTE SECOND <<<${SPEC//:/ }
echo $YEAR
echo $MONTH
echo $DAY
echo $HOUR
echo $MINUTE
echo $SECOND

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

Решение, включающее awk, sed или Perl, будет аналогичным, реализуя разделение меток времени на одном из этих языков.

Я рекомендую решение чисто bash, потому что оно быстрее (не имеетпорождать подпроцесс), и он не имеет внешних зависимостей.В настоящее время (по сравнению с Bourne Shell в 1970-х годах) большинство манипуляций со строками и массивами можно выполнять в самом bash, без необходимости форкать и выполнять expr, tr, sed, awk, perl, cut и т. Д.

С Perl:

SPEC='Image timestamp : 2010:07:27 17:38:52'
read X X YEAR MONTH DAY HOUR MINUTE SECOND <<<$(perl -pe 'y@:@ @' <<<$SPEC)
echo $YEAR
echo $MONTH
echo $DAY
echo $HOUR
echo $MINUTE
echo $SECOND

С tr:

SPEC='Image timestamp : 2010:07:27 17:38:52'
read X X YEAR MONTH DAY HOUR MINUTE SECOND <<<$(tr : ' ' <<<$SPEC)
echo $YEAR
echo $MONTH
echo $DAY
echo $HOUR
echo $MINUTE
echo $SECOND

С sed:

SPEC='Image timestamp : 2010:07:27 17:38:52'
read X X YEAR MONTH DAY HOUR MINUTE SECOND <<<$(sed 's/:/ /g' <<<$SPEC)
echo $YEAR
echo $MONTH
echo $DAY
echo $HOUR
echo $MINUTE
echo $SECOND

С AWK:

SPEC='Image timestamp : 2010:07:27 17:38:52'
read X X YEAR MONTH DAY HOUR MINUTE SECOND <<<$(awk '{gsub(/:/," ");print}' <<<$SPEC)
echo $YEAR
echo $MONTH
echo $DAY
echo $HOUR
echo $MINUTE
echo $SECOND
2 голосов
/ 31 августа 2010

Вот еще один способ

s="Image timestamp : 2010:07:27 17:38:52"
$ IFS="[: ]"
$ set -- $s
$ echo $3
2010
$ echo $4
07
$ echo $5
27
$ echo $6
17
$ echo $7
38
$ echo $8
52
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...