Zsh-скрипт, использующий отформатированную строку даты в команде FFMPEG

В моем скрипте zsh я получаю строку, представляющую эпоху Unix, например:

myTimestamp = "1719742786"

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

theDate=$(date -u -r "$myTimestamp" "+%b %d, %H:%M:%S")
echo "$theDate"

который печатает на моем экране то, что я хочу:

Jun 30, 06:19:48

но когда я пытаюсь использовать эту переменную в своем скрипте ffmpeg, я получаю ошибки:

ffmpeg -y -i "$file" -vf \
        "drawtext=text='$theDate':fontcolor=gray:fontsize=$fontSize:x=$width:y=$height:" \
        "$output"

Обратите внимание: если я заменю '$theDate' в скрипте (на что-то вроде '$myTimestamp'), ошибок не будет.

Вместе с Error initializing filters я получаю следующую (возможно, важную?) ошибку:

Предоставляется как текст, так и текстовый файл. Пожалуйста, укажите только один

Обратите внимание, что я использую MacOS v14.5. man date упоминает The date utility is expected to be compatible with IEEE Std 1003.2 (“POSIX.2”). With the exception of the -u option, all options are extensions to the standard.

Мой полный сценарий:

#!/bin/zsh
outDir = "printed"
width=200
height=650
fontSize=95

for file in initial/*.png; do
    filename=$(basename "$file")
    prefix = "${filename%.*}"
    theDate=$(date -u -r "$prefix" "+%b %d, %H:%M:%S")
    output = "$outDir/$filename"

    echo "$theDate"

    ffmpeg -y -i "$file" -vf \
    "drawtext=text='$theDate':fontcolor=gray:fontsize=$fontSize:x=$width:y=$height:" \
       "$output"

done
exit

Опция даты GNU -r ожидает имя файла, а не метку времени. Смотрите man date.

Cyrus 30.06.2024 13:54

Ваш сценарий не может быть одновременно сценарием Bash и сценарием Zsh, равно как и ваш вопрос не может быть одновременно написан на английском и голландском языках. Который из них? Конечно, если это на самом деле скрипт sh, он также действителен в Bash и (при некоторых обстоятельствах) в Zsh. См. также Разница между sh и bash

tripleee 30.06.2024 14:20

Вы должны опубликовать здесь код, который вы используете, как упомянул @Cyrus, date -r ожидает файл. При выполнении theDate=$(date -u -r "$myTimestamp" "+%b %d, %H:%M:%S") я получаю date: 1719742786: No such file or directory

Marcel Preda 30.06.2024 14:21

Да, спасибо @tripleee. Это Zsh скрипт.

coco 30.06.2024 14:41

И все же, @MarcelPreda, когда я убираю опцию -r в дате, я получаю illegal time format. Я включил полный сценарий. Папка initial содержит набор изображений с такими названиями, как 1719742786.png.

coco 30.06.2024 14:47

Если вы используете MacOS, у вас вообще нет GNU date (по крайней мере, не из коробки). Не могли бы вы отредактировать, чтобы указать свою платформу и, возможно, результат date --help, если вы не знакомы с различиями платформ?

tripleee 30.06.2024 15:56

@tripleee - да, я использую MacOS, и добавил этот факт в пост. И похоже, что -u нестандартно для MacOS.

coco 30.06.2024 17:28

Если предположить, что команда date ... работает, то проблема может заключаться в том, что в строке $theDate есть : (двоеточия), которые используются в качестве разделителей полей для ввода фильтров ffmpeg. Либо вы избегаете двоеточий, либо используете другой символ, либо записываете $theDate в файле типа the_date.txt и после этого используете ffmpeg -y -i "$file" -vf "drawtext=textfile=the_date.txt:... . Я выберу последний вариант: пишите в файл и пользуйтесь drawtext=textfile=...

Marcel Preda 30.06.2024 17:31

@MarcelPreda - Ты прав! Я избежал двоеточий, и это работает! Я не хотел писать в файл, потому что с помощью скрипта я создаю тысячи изображений. (Вы хотите это написать?)

coco 30.06.2024 17:56

Проблема не столько в том, что -u нестандартен, сколько в том, что комментаторы GNU/Linux предполагают, что у вас есть другие нестандартные опции, которые «де-факто» являются стандартными на их платформе.

tripleee 30.06.2024 18:13

Кстати, вам не нужен дочерний процесс для basename. Можно просто написать filename=$file:t.

user1934428 30.06.2024 19:19

Дубликат stackoverflow.com/questions/55334636/…

tripleee 01.07.2024 15:14

@coco, вы сказали I didn't want to write to a file, because there are thousands of images that I'm creating with the script. Если вы не выполняете команды ffmpeg параллельно, вы можете использовать тот же файл, просто обновите содержимое.

Marcel Preda 01.07.2024 18:09
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java была сильно переработана начиная с версии Java 8 и далее с появлением библиотеки java.time.
4
13
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как упоминалось в комментарии: Проблема в том, что в строке $theDate есть : (двоеточия), которые используются как разделители полей для ввода фильтров ffmpeg.

Либо вы избегаете двоеточий, либо используете другой символ, либо записываете $theDate в файл типа the_date.txt и после этого используете

ffmpeg -y -i "$file" -vf  "drawtext=textfile=the_date.txt:... "

Я выберу последний вариант: записать в файл и использовать drawtext=textfile=... Если вы не выполняете команды ffmpeg параллельно, вы можете повторно использовать один и тот же файл. Если вы выполняете команды ffmpeg параллельно, вам необходимо создавать уникальные имена файлов и удалять их после завершения команды ffmpeg, чтобы не оставлять там тысячи файлов.

Использование внешнего файла кажется гораздо более опасным, чем просто экранирование глупых двоеточий. date +"%b %d, %H\:%M\:%S"

tripleee 01.07.2024 18:41

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