0

我有一个大文件夹树,并想制作一个脚本来打开 gThumb 或基于关键字搜索的其他图像查看器。 exiftool已经安装在我的系统上。和命令

exiftool -a -r -G1 -s $FILE 

以格式打印数据

[ExifTool]      ExifToolVersion                 : 8.60
[System]        FileName                        : 4-4_wlax_0127.jpg
[System]        Directory                       : .
[System]        FileSize                        : 6.3 MB
[System]        FileModifyDate                  : 2012:04:05 13:57:54-04:00
[System]        FilePermissions                 : rwxrwxrwx

目前,

exiftool -a -r -G1 -s . | grep Keywords | grep "$1*" 

将元数据的关键字行打印为

[IPTC]          Keywords                        : 2012, Womens Lax, ..., ...

$1关键字搜索值在哪里。现在,我的解决方案是使用两个循环,每个循环exiftool对不同的 grep 值执行调用。如何执行单个exiftool调用以匹配关键字,将关联的文件名传递给列表。

编辑-澄清:

如果关键字字段存在匹配项,我想打印出 FileName 行。但是,在文本输出中,关键字存在于 FileName 下方约 20 行。

4

3 回答 3

2

只需使用,而不是所有那些管道!

% exiftool -a -r -G1 -s . | awk -v search='your search string here' '
    $2 ~ /FileName/ { filename = $0 }
    $2 ~ /Keywords/ && $0 ~ search { print filename }
'

这假定对于每个处理的文件Filename总是出现在之前。Keywords如果您有多个要搜索的字符串,只需用管道分隔它们(这是一个正则表达式!):

% exiftool -a -r -G1 -s . | awk -v search='first|second' '
    $2 ~ /FileName/ { filename = $0 }
    $2 ~ /Keywords/ && $0 ~ search { print filename }
'

如果您想要文件名(而不是整行),也许这是一个更简洁的解决方案:

% exiftool -a -r -G1 -s . | awk -F': ' -v search='first|second|third' '
    $1 ~ /FileName/ { filename = $2 }
    $1 ~ /Keywords/ && $2 ~ search { print filename }
'

当然,您也可以在同一个程序中完成所有文本处理。

于 2013-02-13T21:35:30.203 回答
2

使用 exiftool -if 选项:

exiftool -filename -s3 -if '$keywords=~/some keyword/' 。

于 2013-02-14T13:26:50.947 回答
1

如果我正确理解您的问题,您有多个要过滤的关键字。使用egrep和 -|运算符:

exiftool -a -r -G1 -s . | grep Keywords | egrep "$1|$2" 

而 $1 是第一个关键字, $2 是第二个关键字。egrep可以替换grep -Eegrep已弃用的 as 。

编辑(在问题实际改变之后):你应该提出一个新问题。

您可以对所有文件进行循环,如果文件与您使用的关键字之一匹配。例如:

for n in `ls`; do
    c=`exiftool -a -G1 -s $n | grep Keywords | egrep "$1|$2" | wc -l`
    if [ $c -gt 0 ]; then
         echo $n has matched
    fi
done
于 2013-02-13T21:03:38.453 回答