如何使用Bash脚本解析EXIF时间戳

hpy*_*hpy 5 bash time parsing timestamp

作为一个bash脚本菜鸟,详细的答案将不胜感激.:)

我正在尝试编写一个bash脚本来解析从exiv2 commmandline实用程序输出的JPEG EXIF时间戳,这给出了典型的输出,如:

图像时间戳: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"
Run Code Online (Sandbox Code Playgroud)

谢谢!

pts*_*pts 6

这是一个用于拆分时间戳规范行的纯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
Run Code Online (Sandbox Code Playgroud)

上面的解决方案将冒号转换为规范中的空格,将其拆分为空白,并将每个项目放在相应的变量中.

涉及awk,sed或Perl的解决方案类似,在其中一种语言中实现时间戳拆分.

我建议使用纯bash解决方案,因为它更快(不必生成子进程),并且它没有外部依赖性.如今(与20世纪70年代的Bourne Shell相比)大多数字符串和数组操作都可以在bash中完成,无需fork和exec 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
Run Code Online (Sandbox Code Playgroud)

用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
Run Code Online (Sandbox Code Playgroud)

用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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)