Хорошо, таким образом, я записал функцию, какие циклы через все файлы в папке (только на глубину 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 управляет возвратом? это возвращает просто имя файла файла, который был изменен?
## 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
}
Это мое предложение:
#!/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
Я полагаю, есть более причудливые способы сделать это. Проверьте, работает ли он.