わかりましたので、フォルダー内のすべてのファイルを(深さ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
}
私は現在OBSを使用してVHSテープをリッピングしており、新しいファイルが追加されるたびに実行されるように監視機能を設定できることを望んでいました。
他のスレッドで、inotifywaitを使用できることを確認しましたが、構文の設定方法などはわかりません。
例えば、私は this thread this scriptで見ました:
#!/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
したがって、最初の問題は、現在の関数をそこに追加しただけで、新しいファイルが追加されるたびにすべてのファイルを圧縮しようとするだけだと思います。
だから代わりに、私はforループを外して、代わりに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
これを行うためのより洗練された方法があると思います。機能するかどうかをテストします。