web-dev-qa-db-ja.com

フォルダーに追加された新しいファイルでのみffmpegコマンドを監視してトリガーする

わかりましたので、フォルダー内のすべてのファイルを(深さ1まで)ループし、それらをより小さいファイルサイズに圧縮する関数を作成しました。

編集:私の編集をチェックAT THE BOTTOM

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コマンドは何を返しますか?変更されたファイルのファイル名だけを返しますか?

編集:まあ、私はものについて熟考していたので、マンページをチェックしましたが、OBSによって実際にファイルの作成が完了する最後ではなく、OBSによってイベントが2回トリガーされることを除いて、それを理解したと思います

## 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
David A. French

これは私の提案です:

#!/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