Другое

Как получить список файлов, обработанных Exiftool

Узнайте, как отслеживать файлы, обработанные exiftool, с помощью опции -v0, перенаправления вывода и других методов. Решите проблемы с FileModifyDate и поддерживайте точные временные метки для вашего рабочего процесса с фотографиями.

Как получить список выходных файлов, созданных exiftool для обновления дат изменения файлов?

Я использую exiftool для копирования файлов с моей камеры на жесткий диск с помощью следующей команды:

exiftool -r \
  -copyright="Copyright $yr Brad Lanam" \
  '-imagedescription^=' \
  "-FileName<DateTimeOriginal" \
  -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" "$@" \
  "-FileModifyDate<CreateDate#" \
  -sep ", " "-keywords<$tkw"

После обновления до Debian 13 команда -FileModifyDate завершается с ошибкой:

Warning: Invalid date/time (no year) using Time::Piece in File:FileModifyDate (PrintConvInv)

Удаление # после CreateDate устраняет ошибку, но временная метка файла неверна (показывает как Nov 10 00:00).

Я обнаружил, что выполнение:

exiftool -r "-FileModifyDate<CreateDate" -f .

работает правильно, но мне нужно знать, какие файлы были обработаны исходной командой, чтобы отдельно обновить их временные метки.

Существует ли опция или метод для получения списка файлов, обработанных или созданных exiftool?

Как получить список обработанных файлов exiftool

Вы можете получить список файлов, обработанных exiftool, с помощью опции -v0, которая выводит имя каждого обрабатываемого файла при выполнении операций записи. Для вашего конкретного рабочего процесса также можно использовать опцию -W вместе с -v для фиксации как списка обработанных файлов, так и выходной информации, или перенаправить вывод exiftool в файл при выполнении исходной команды для сохранения записи обо всех обработанных файлах.

Содержание

Получение списка обработанных файлов

Самый простой способ получить список файлов, обработанных exiftool, — использовать опцию детализации -v0. Эта опция специально выводит имя каждого обрабатываемого файла во время операций записи, что делает ее идеальной для вашего случая использования.

bash
exiftool -r -v0 \
  -copyright="Copyright $yr Brad Lanam" \
  '-imagedescription^=' \
  "-FileName<DateTimeOriginal" \
  -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" "$@" \
  "-FileModifyDate<CreateDate#" \
  -sep ", " "-keywords<$tkw"

При использовании -v0 exiftool будет выводить каждый имя файла по мере их обработки, позволяя вам сохранить эту информацию для последующего использования при обновлении временных меток отдельно. Опция -v0 особенно полезна, так как она сбрасывает буфер вывода консоли после каждой строки, что помогает избежать задержек при перенаправлении вывода exiftool и обеспечивает получение обратной связи в реальном времени об обработанных файлах.

Опции детализации для вывода списка файлов

ExifTool предоставляет несколько уровней детализации, которые могут помочь отслеживать обработанные файлы:

  • -v0: Выводит имя каждого обрабатываемого файла при записи, новые имена файлов при переименовании/перемещении/копировании и сбрасывает буфер вывода после каждой строки
  • -v1 до -v5: Более высокие уровни детализации, которые предоставляют более подробную информацию о процессе обработки, но могут подавлять обычный вывод консоли, если не извлекаются определенные теги
  • Несколько флагов -v: Каждая опция -v увеличивает уровень детализации на 1, если не указано число

В официальной документации объясняется, что “Использование -v0 приводит к сбросу буфера вывода консоли после каждой строки (что может быть полезно для избежания задержек при перенаправлении вывода exiftool) и выводит имя каждого обрабатываемого файла при записи и новое имя файла при переименовании, перемещении или копировании.”

Для ваших конкретных потребностей -v0 является оптимальным выбором, так как он предоставляет именно то, что вам нужно — чистый список обработанных файлов без избыточной детализации.

Альтернативные методы фиксации обработанных файлов

Использование перенаправления вывода

Вы можете перенаправить вывод exiftool в файл при выполнении команды:

bash
exiftool -r \
  -copyright="Copyright $yr Brad Lanam" \
  '-imagedescription^=' \
  "-FileName<DateTimeOriginal" \
  -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" "$@" \
  "-FileModifyDate<CreateDate#" \
  -sep ", " "-keywords<$tkw" > processed_files.log 2>&1

Это позволит зафиксировать как обычный вывод, так и любые предупреждения или ошибки в файле processed_files.log.

Использование опции -W с -v

Опция -W позволяет записывать вывод в файл, а при комбинировании с -v она предоставляет дополнительную информацию:

bash
exiftool -r -v -W+ output_info.txt \
  -copyright="Copyright $yr Brad Lanam" \
  '-imagedescription^=' \
  "-FileName<DateTimeOriginal" \
  -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" "$@" \
  "-FileModifyDate<CreateDate#" \
  -sep ", " "-keywords<$tkw"

Как указано в man-странице Ubuntu, “Добавление опции -v к -W отправляет список тегов и имен выходных файлов в консоль вместо предоставления подробного дампа всего файла.”

Комбинирование нескольких подходов

Для комплексного отслеживания можно комбинировать несколько подходов:

bash
# Выполнение команды с фиксацией как обработанных файлов, так и предупреждений
exiftool -r -v0 \
  -copyright="Copyright $yr Brad Lanam" \
  '-imagedescription^=' \
  "-FileName<DateTimeOriginal" \
  -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" "$@" \
  "-FileModifyDate<CreateDate#" \
  -sep ", " "-keywords<$tkw" | tee processed_files.txt

# Или создание более подробного журнала
exiftool -r -v1 \
  -copyright="Copyright $yr Brad Lanam" \
  '-imagedescription^=' \
  "-FileName<DateTimeOriginal" \
  -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" "$@" \
  "-FileModifyDate<CreateDate#" \
  -sep ", " "-keywords<$tkw" > detailed_processing.log 2> warnings.log

Решение проблемы с FileModifyDate

Ваша проблема с командой "-FileModifyDate<CreateDate#", которая перестала работать после обновления до Debian 13, связана с символом # в выражении даты/времени. Согласно документации ExifTool, символ # имеет специальное значение в выражениях даты/времени.

Рекомендуемое решение

Вместо использования символа # можно использовать опцию -api для управления парсингом дат:

bash
exiftool -r -api StrictDate=1 \
  -copyright="Copyright $yr Brad Lanam" \
  '-imagedescription^=' \
  "-FileName<DateTimeOriginal" \
  -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" "$@" \
  "-FileModifyDate<CreateDate" \
  -sep ", " "-keywords<$tkw"

Опция -api StrictDate=1 обеспечивает корректный парсинг дат без необходимости использования символа #, сохраняя точность временных меток.

Альтернативный подход с раздельной обработкой

Если вы предпочитаете обрабатывать файлы в два этапа (сначала исходной командой, затем обновлять временные метки), вы можете зафиксировать обработанные файлы и выполнить вторую команду:

bash
# Этап 1: Получение списка файлов, которые будут обработаны
exiftool -r -filename -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" "$@" | cut -f1 > files_to_process.txt

# Этап 2: Обработка файлов исходной командой (без FileModifyDate)
exiftool -r \
  -copyright="Copyright $yr Brad Lanam" \
  '-imagedescription^=' \
  "-FileName<DateTimeOriginal" \
  -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" \
  -sep ", " "-keywords<$tkw" \
  -@ files_to_process.txt

# Этап 3: Обновление FileModifyDate отдельно
exiftool -r -v0 "-FileModifyDate<CreateDate" -@ files_to_process.txt

Практические примеры реализации

Пример 1: Полный рабочий процесс с отслеживанием файлов

bash
#!/bin/bash
# Обработка файлов и отслеживание измененных файлов

LOG_FILE="exiftool_processing_$(date +%Y%m%d_%H%M%S).log"
PROCESSED_FILES="processed_files_$(date +%Y%m%d_%H%M%S).txt"

echo "Начало обработки exiftool в $(date)" | tee "$LOG_FILE"

# Выполнение основной команды обработки с -v0 для отслеживания файлов
exiftool -r -v0 \
  -copyright="Copyright $yr Brad Lanam" \
  '-imagedescription^=' \
  "-FileName<DateTimeOriginal" \
  -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" "$@" \
  "-FileModifyDate<CreateDate" \
  -sep ", " "-keywords<$tkw" | tee "$PROCESSED_FILES"

echo "Обработка завершена. Обработанные файлы сохранены в: $PROCESSED_FILES" | tee -a "$LOG_FILE"

# При необходимости: обновление FileModifyDate отдельно
if [ -s "$PROCESSED_FILES" ]; then
    echo "Обновление FileModifyDate для обработанных файлов..." | tee -a "$LOG_FILE"
    exiftool -r -v0 "-FileModifyDate<CreateDate" -@ "$PROCESSED_FILES" | tee -a "$LOG_FILE"
fi

Пример 2: Использование CSV-вывода для отслеживания

bash
# Создание CSV-файла со всеми обработанными файлами и их новыми расположениями
exiftool -r -csv -filename -directory \
  -copyright="Copyright $yr Brad Lanam" \
  '-imagedescription^=' \
  "-FileName<DateTimeOriginal" \
  -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" "$@" \
  "-FileModifyDate<CreateDate" \
  -sep ", " "-keywords<$tkw" > processing_report.csv

# CSV будет содержать все файлы и их новые расположения для справки

Пример 3: Рекурсивная обработка с подробным журналированием

bash
# Обработка всех файлов в текущей директории рекурсивно с полным журналированием
exiftool -r -v1 \
  -copyright="Copyright $yr Brad Lanam" \
  '-imagedescription^=' \
  "-FileName<DateTimeOriginal" \
  -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" . \
  "-FileModifyDate<CreateDate" \
  -sep ", " "-keywords<$tkw" > full_processing.log 2> processing_errors.log

# Извлечение только имен обработанных файлов
grep "Processing [0-9]" full_processing.log | awk '{print $3}' > processed_files_list.txt

Лучшие практики для пакетной обработки

1. Всегда тестируйте сначала с -r -v0

Перед выполнением больших пакетных операций сначала тестируйте с опциями -r -v0, чтобы увидеть, какие файлы будут обработаны:

bash
# Тестовый запуск для просмотра файлов, которые будут обработаны
exiftool -r -v0 -testname \
  -copyright="Copyright $yr Brad Lanam" \
  '-imagedescription^=' \
  "-FileName<DateTimeOriginal" \
  -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" "$@"

2. Используйте опции резервного копирования

Всегда учитывайте использование опций резервного копирования при изменении файлов:

bash
# Создание резервных копий файлов перед обработкой
exiftool -r -v0 -ext jpg -ext cr2 -ext nef \
  -copyright="Copyright $yr Brad Lanam" \
  '-imagedescription^=' \
  "-FileName<DateTimeOriginal" \
  -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" "$@" \
  "-FileModifyDate<CreateDate" \
  -overwrite_original -backup_out

3. Мониторьте прогресс обработки

Для больших пакетов регулярно мониторьте прогресс:

bash
# Обработка пакетами с отслеживанием прогресса
for dir in "$@"; do
    echo "Обработка директории: $dir"
    exiftool -r -v0 \
      -copyright="Copyright $yr Brad Lanam" \
      '-imagedescription^=' \
      "-FileName<DateTimeOriginal" \
      -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" "$dir" \
      "-FileModifyDate<CreateDate" \
      -sep ", " "-keywords<$tkw" | tee -a "progress_$(date +%Y%m%d).log"
done

4. Обрабатывайте ошибки корректно

Реализуйте обработку ошибок для надежной пакетной обработки:

bash
#!/bin/bash
ERROR_LOG="errors_$(date +%Y%m%d_%H%M%S).log"
SUCCESS_LOG="success_$(date +%Y%m%d_%H%M%S).log"

exiftool -r -v1 \
  -copyright="Copyright $yr Brad Lanam" \
  '-imagedescription^=' \
  "-FileName<DateTimeOriginal" \
  -d "$HOME/pics/%Y/%m-%d/%%lf.%%le" "$@" \
  "-FileModifyDate<CreateDate" \
  -sep ", " "-keywords<$tkw" 2> "$ERROR_LOG" | tee "$SUCCESS_LOG"

if [ -s "$ERROR_LOG" ]; then
    echo "Во время обработки произошли ошибки. Подробнее см. в $ERROR_LOG."
    exit 1
else
    echo "Обработка успешно завершена."
    exit 0
fi

Источники

  1. Документация приложения ExifTool - Опции детализации
  2. Опция детализации ExifTool - Подробное объяснение
  3. Man-страница Ubuntu - Опции команды exiftool
  4. Документация MIT ExifTool - Опции вывода
  5. Man Pages - Справка по команде exiftool
  6. Руководство Arch Linux - Детализация exiftool
  7. Исходный код GitHub ExifTool - Реализация детализации

Заключение

Чтобы получить список файлов, обработанных exiftool, используйте опцию -v0, которая выводит каждое имя файла по мере его обработки во время операций записи. Для вашего конкретного рабочего процесса с проблемой FileModifyDate рассмотрите использование -api StrictDate=1 вместо символа # в выражениях дат или обрабатывайте файлы в два отдельных этапа, отслеживая, какие файлы были изменены.

Ключевые выводы:

  • Используйте -v0 для получения чистого списка обработанных файлов
  • Рассмотрите использование -api StrictDate=1 для корректного парсинга дат без специальных символов
  • Комбинируйте -v0 с перенаправлением вывода для комплексного журналирования
  • Тестируйте ваши команды с -testname перед полной пакетной обработкой
  • Всегда поддерживайте корректную обработку ошибок и стратегии резервного копирования для важных файловых операций

Эти методы дадут вам полный контроль над отслеживанием файлов, обрабатываемых exiftool, позволяя обрабатывать обновления временных меток отдельно при необходимости.

Авторы
Проверено модерацией
Модерация