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

Хорошо, таким образом, я записал функцию, какие циклы через все файлы в папке (только на глубину 1) и сжимает их до меньшего размера файла.

Править: ПРОВЕРЬТЕ МОЕ РЕДАКТИРОВАНИЕ ВНИЗУ

function compressMP4batch()  {
for fname in *.mp4
do

#take off the mp4
pathAndName=${fname%.mp4}

#take off the path from the file name
videoname=${pathAndName##*/}

#take off the file name from the path
videopath=$pathAndName:h

#create new folder for converted icons to be placed in
mkdir -p ${videopath}/compressed/

ffmpeg -y -r 30  -i ${fname} -vcodec libx265 -crf 18 -acodec mp3 -movflags +faststart ${videopath}/compressed/${videoname}-compressed.mp4



echo "\033[1;33m compressed ${videoname}\n \033[0m"
done

}

Я в настоящее время разрываю ленты VHS с помощью OBS, и я надеялся, что мог установить функцию часов для выполнения каждый раз, когда новый файл добавляется.

Я видел в других потоках, что inotifywait может использоваться для этого, но я не вполне добираюсь, как это - синтаксис, настраивается и т.д.

Например, я видел в этом потоке этот сценарий:

#!/bin/bash
dir=BASH
inotifywait -m "$dir" -e close_write --format '%w%f' |
    while IFS=' ' read -r fname
    do
        [ -f "$fname" ] && chmod +x "$fname"
    done

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

Таким образом вместо этого, я мог вынуть мой для цикла и вместо этого просто выполнить команду ffmpeg

но что inotifywait управляет возвратом? это возвращает просто имя файла файла, который был изменен?

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

## Requires ffmpeg and inotify-tools

# testing with this: inotifywait -m . -e create  --format '%w%f' | cat

# inotifywait --monitor . --event create --event move_to --event modify  --format '%w%f'

function compressMP4watch()  {
 inotifywait --monitor . --event create  --format '%w%f' |

 while read -r fname
    do

    #take off the mp4
    pathAndName=${fname%.mp4}

    #take off the path from the file name
    videoname=${pathAndName##*/}

    #take off the file name from the path
    videopath=$pathAndName:h

    mkdir -p ${videopath}/compressed/

    ffmpeg -y -r 30  -i ${fname} -vcodec libx265 -crf 18 -acodec mp3 -movflags +faststart ${videopath}/compressed/${videoname}-compressed.mp4

    echo "\033[1;33m compressed ${videoname}\n \033[0m"

    done

}

1
задан 29 June 2019 в 04:22

1 ответ

Это мое предложение:

#!/bin/bash
# dir to whatch
dir=~/your_dir/

# trigger when a file is moved to the dir
inotifywait -m $dir -e moved_to | \
while read -r i; do 
  # get the file name
  file_name=$(echo "$i" | grep -o "MOVED_TO.*" | sed 's/MOVED_TO //')
  # file name plus dir = full path
  file="$dir$filename"
  # apply your function (not the loop) to the file, you can pass the file as parameter
  your_function "$file"
done

Я полагаю, есть более причудливые способы сделать это. Проверьте, работает ли он.

1
ответ дан 29 June 2019 в 04:22

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

Похожие вопросы: