我有这个脚本,它使用 exiftool 12.57 处理 Ubuntu 22.04 上子文件夹中的图像:
#!/bin/bash
set -e
DIR=/path/to/photos
for f in $(find "${DIR}" -type f -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png");
do
echo "processing ${f}..."
exiftool "${f}" >> output.txt
printf -- '#%.0s' {1..80} >> output.txt
printf '\n' >> output.txt
done
但是当它到达一个空文件时,它就会停止,而不会向 stdout/stderr 抛出任何警告或错误:
$ tail output.txt
################################################################################
ExifTool Version Number : 12.57
File Name : 20222601_DSC00057.JPG
Directory : /path/to/photos/experiment 11
File Size : 0 bytes
File Modification Date/Time : 2020:10:26 15:03:22+01:00
File Access Date/Time : 2023:03:02 16:47:51+01:00
File Inode Change Date/Time : 2023:03:02 15:07:08+01:00
File Permissions : -rw-rw-r--
Error : File is empty
该文件确实是一个0字节文件:
$ ls -larth /path/to/photos/experiment\ 11/20222601_DSC00057.JPG
-rw-rw-r-- 1 1000 1000 0 Feb 12 2021 '/path/to/photos/experiment 11/20222601_DSC00057.JPG'
我如何让脚本继续处理其他文件,因为还有许多包含照片的文件夹需要处理?
版本信息
$ bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
$ uname -mor
5.19.0-32-generic x86_64 GNU/Linux
$ exiftool -ver
12.57
答案1
为了后人,也因为我也发现它非常有趣,所以我将 steeldriver 的答案重建为社区维基:
set -e
exiftool
当返回非零退出状态时(传递一个空文件时显然会这样做),会导致 shell(脚本)退出。如果由于其他原因需要运行该脚本
set -e
,您可以:
set +e
在命令之前exiftool
,然后set -e
重置或者(我认为更地道)
改变:
exiftool "${f}" >> output.txt
到:
exiftool "${f}" >> output.txt || true
这样,无论简单命令的退出状态如何,复合命令始终都能成功退出
exiftool
顺便说一句,你的
find
命令输出循环很脆弱 - 请参阅为什么循环查找的输出是不好的做法?
答案2
检查空文件并且不要求exiftool
处理它:
if [[ -s "${f}" ]] ; then
exiftool "${f}" >>output.txt
else
echo "Empty" >>output.txt
fi
读man bash
。