Shell: использование for в списке переменных

К сожалению, мои навыки работы с оболочкой очень плохие, и мне понадобится некоторая помощь в запуске простого скрипта на моем QNAP, чтобы исправить некоторые проблемы с датой в некоторых видео.

Сценарий, который я написал, очень прост:

  1. в данной папке
  2. проверьте, существуют ли файлы.mp4, начинающиеся с VID_
  3. если это так, для каждого из них выполните заданную команду exiftool

Вот сценарий, но я думаю, что я не использую правильный способ вызова переменной:

#!/bin/sh

# set target directories
dir="/share/Multimedia/Pictures/"

# move to target directory
cd "$dir"

# check if there is some .mp4 file starting with "VID_" in the folder

VID=$(ls -A $dir | grep 'VID_' | grep './mp4')

if
    ["$VID"];

then

    # for each file in the list
    for f in $VID

        do

        # change all date metadata according to its filename
        exiftool "-*date<filename" -wm w $f

done

else

fi

Спасибо за вашу помощь!

ps: инструкция exiftool верна (за исключением, вероятно, переменной)

2 ответа

Решение

Нет необходимости в сценарии, это просто замедляет работу, поскольку вы должны вызывать ExifTool для каждого файла. ExifTool может сделать все файлы за один проход:
ExifTool -ext mp4 '-*date<filename' -wm w /path/to/dir/VID_*

-ext mp4 options ограничивает команду только файлами mp4. Поскольку вы, похоже, находитесь в системе linux/mac, двойные кавычки пришлось заменить на одинарные. Двойные кавычки необходимы в системах Windows, одинарные кавычки в системах Linux / Mac.

Возможно, ваш код не работает из-за использования:

grep './mp4'

Так как нет / до mp4,

Лучше иметь свой скрипт как:

#!/bin/sh

# set target directories
dir="/share/Multimedia/Pictures/"

# move to target directory
cd "$dir"

for f in VID_*.mp4; do
   exiftool "-*date<filename" -wm w "$f"
done

Нет необходимости анализировать вывод ls здесь и нет необходимости использовать grep так как шар VID_*.mp4 сделает работу по поиску правильных файлов.

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