find -execとwhileを使用してforループを作成する

find -execとwhileを使用してforループを作成する

00時から12時の間に生成された映像ファイルを繰り返してffmpegを利用して変換した後、削除するスクリプトを作ってみたいと思います。

スクリプトはファイルを見つけてffpmegを起動して動作しますが、最初のffmpeg変換が開始された後はfind -execで文字を「送信」し続け、最終的にffmpegを停止して変換を停止します。これが発生しないようにするには、スクリプトをどのように変更する必要がありますか?

現在のスクリプト

!/bin/bash -e
find /videos/. -type f -print0 -exec sh -c 'h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 00 ] && [ "$h" -lt 12 ]'   sh {} \;|while read -d $'\0' i;
do 
    ffmpeg -y -i "$i" -vcodec libx264 -crf 27 -preset veryfast -movflags +faststart -c:a copy -threads 14 /output/"$(basename "$i" .ts)".mp4
    rm -f -- "$i"
done

ベストアンサー1

Gordon Davissonのおかげで、この問題を解決することができました。後でこの問題が発生した場合、作業スクリプト全体は次のようになります。

#!/bin/bash -e
find /videos/. -type f -exec sh -c 'h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 00 ] && [ "$h" -lt 12 ]' sh {} \; -print | while IFS= read -r i;
do 
    ffmpeg -y -i "$i" -vcodec libx264 -crf 27 -preset veryfast -movflags +faststart -c:a copy -threads 14 /output/"$(basename "$i" .ts)".mp4 </dev/null
    rm -f -- "$i"
done

おすすめ記事