我有一个目录,里面全是图片,所有图片都带有各种“关键字”标签。我怎样才能(在 Linux shell 中)列出全部图像包含keyword1
和/或keyword2
?
答案1
好的,以下是我整理的内容:
exiftool -ext .JPG -fast -p '$directory/$filename;$Keywords' -qq -r -m . 2> /dev/null | grep -i '\;.*keyword1\|keyword2\|keyword3' | sed 's/\;.*//'
这将生成一个包含任一关键字的所有文件名的干净列表,您可以根据需要输入任意数量的文件;然后,您可以将其提供给查看器以动态构建图库/幻灯片,就像在这个最终函数中一样:
px-image-tag-viewer () {
TAGS=
SLIDESHOW_OPS=
for i in ${*}; do
[[ ${i} =~ '^[0-9]+$' ]] && SLIDESHOW_OPS="-D${i} --fullscreen" || TAGS+="${i}\|"
done
exiftool -ext .JPG -fast -p '$directory/$filename;$Keywords' -qq -r -m . 2> /dev/null | grep -i "\;.*${TAGS: : -2}" | sed 's/\;.*//' > /tmp/imglist.txt
feh ${SLIDESHOW_OPS} --auto-zoom --filelist /tmp/imglist.txt
rm -fv /tmp/imglist.txt
}
进入目录并像这样调用它:
px-image-tag-viewer holidays sigma horiz 5
标签之间用空格分隔,幻灯片放映的秒数可选。
答案2
exiftool
您可以使用其-if
条件语法和打印输出标志单独实现您需要的功能,-p
如下所示:
exiftool -ext JPG -if '$Keywords =~ /(keyword1|keyword2)/' -p '$directory/$filename' -r .
这将使用正则表达式匹配关键字,递归扫描当前目录,并打印出它们的文件名。它与grep
和 的作用差不多sed
,但仅使用exiftool
和 。由于表达式类似于 Perl,因此您可以获得更多功能-if
,并且它不仅可以执行字符串匹配(例如gt
和lt
其他 Perl 运算符)。
根据需要调整或删除-ext JPG
其他文件格式的检查(不区分大小写),并同样调整-p
选项以控制输出的格式。