ここで、完了までに長い時間がかかるループ呼び出しプロセスを発見しました。どうすればそれから抜け出すことができますか?find から ffmpeg cli [HandBrakeCLI] を呼び出す while ループへのパイピングは、複数の入力ファイルを処理しません。これは、ffmpeg にはすべての入力リストを一度に「食べて」ループを「飢えさせる」という癖があるためです。
解決策は、 http://mywiki.wooledge.org/BashFAQ/089に従って /dev/nullからリダイレクトすることでした。これは正常に機能します。ただし、元の問題と解決しようとしている質問に戻ります。
/dev/null には、HandBrakeCLI にフィードするすべてのファイルの完全なリストが含まれているため、ctrl-c だけではループを終了するのに十分ではありません。
トラップのさまざまな順列を試しましたが、HandBrakeCLI が現在の入力を処理してから次の入力に移るのを停止する以外に何もすることができません。ループをすぐに終了する代わりに、HandBrakeCLI 行の直後に mv も処理します。
1. ctrl-c または kill コマンドですべてを終了するにはどうすればよいですか? 2. (1.) で処理されない場合、ループ内の mv が実行されないようにするにはどうすればよいですか?
質問に対処するために、これはコードの簡略化されたバージョンです。
#!/bin/bash
source_dir="/Volumes/Volumename"
dest_dir="/Volumes/Volumename/Converted/"
finished_dir="Volumes/Volumename/Processed/"
find "$source_dir" -type d -name "VIDEO_TS" | while read -r dir; do
name=${dir%/VIDEO_TS}
mov_dir=${dir%/*}
name=${name##*/}
./HandBrakeCLI -i "$dir" -o "$dest_dir/$name.m4v" </dev/null
mv "$mov_dir" "finished_dir"
done