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

标签 parsing bash time timestamp

作为bash脚本菜鸟,请详细解答。 :)

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

Image timestamp : 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"

谢谢!

最佳答案

这里是一个纯 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 解决方案,因为它速度更快(不必生成子进程),并且没有外部依赖项。如今(与 1970 年代的 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

与 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

关于parsing - 如何使用 Bash 脚本解析 EXIF 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3603988/

相关文章:

java - 解析非负 double

java - 无法解析java中字符串中的字符

arrays - 在 Bash 中访问 JSON 对象 - 关联数组/列表/另一个模型

从 Bash 调用的 Python 脚本不执行任何操作

MySql:最近的行之间的时间差

python - 在 Python 中添加持续时间

time - Shopify 时差

parsing - protobuf 文本格式解析映射

用 C 计算标量积和字符串操作

bash - 如何在现有 txt 文件中用 Bash 编写第二列