Сценарий Bash останавливается без ошибок, когда извлечение EXIF ​​изображений с помощью exiftool обнаруживает пустой файл.

У меня есть этот скрипт, который обрабатывает изображения в подпапках на Ubuntu 22.04 с помощью exiftool 12.57:

      #!/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

2 ответа

Для потомков и потому, что мне это тоже очень интересно, я перестраиваю ответ steeldriver как вики сообщества:

заставляет оболочку (скрипт) выйти, когда возвращает ненулевой статус выхода (что, по-видимому, происходит при передаче пустого файла).

Если вам нужно запустить скрипт по другим причинам, вы можете:

  • set +eперед командой, а затем сброситьset -eпосле

или (более идиоматично, я думаю)

изменять:

       exiftool "${f}" >> output.txt

к:

       exiftool "${f}" >> output.txt || true

так что составная команда всегда завершается успешно, независимо от статуса выхода простой командыexiftool

Кстати, ваша петля надfindвывод команды хрупкий - см. Почему зацикливание вывода find является плохой практикой?

Проверить наличие пустого файла и не спрашиватьexiftoolобработать его:

      if [[ -s "${f}" ]] ; then
   exiftool "${f}" >>output.txt
else
    echo "Empty" >>output.txt
fi

Читатьman bash.

Другие вопросы по тегам