2016-09-17 9 views
0

動画のリストを繰り返し、スクリプトを使用して.aviから.mp4に変換します(各ファイルについて約1分かかる)。bashスクリプトで長い関数を繰り返し呼び出す方法

find . -name "*.avi" -type f | while read FILE; do 
    HandbrakeCLI [flags] $FILE # execute 30 sec ~ 2 min function here 
done 

問題は、連続した呼び出しがブロックであるように、最初のファイルでのみ実行されているようです。

各ケースを処理するために非同期スレッドを生成するにはどうすればよいですか?


これは、SSHの新しいプロセスを解決しようとしているそのほかの問題の複製である、そしてこの溶液を、SSHで使用可能な引数に基づいています。 イテレータで新しいbashスレッドを生成する方法を尋ねています。そういう意味で重複しているチケットがありますか?

+1

find . -type f -name "*.avi" -exec sh -c 'FILE="$1" HandbrakeCLI &' sh {} \; 

このコマンドが実行されているものをトレースするには、あなたはそのようにそれを変更することができますファイル? – Cyrus

+0

ただのメモです。ループは必要ありません。 'find'の' -exec'オプションを使うことができます: 'find。 -name "* .avi" -type f -exec HandbrakeCLI ... {} \; ' – hek2mgl

+0

コマンドラインでアンパサンド'& 'を最後の文字' HandbrakeCLI& 'で指定します。これはすべてのコマンドに対して新しいスレッドを開始します。 – PeterMmm

答えて

2

HandbreakCLIスクリプトは一度だけ呼び出されると仮定すると、標準入力が端末であるかどうかに応じて動作が異なるか、標準入力が排除されるかの根本的な原因が考えられます。そのような場合には、ここfind内から問題を克服する方法である:

あなたは変数$を使用しない
find . -type f -name "*.avi" -exec sh -c 'set -x; FILE="$1" HandbrakeCLI &' sh {} \; 
+0

本当に。電話で解答しようとする...簡単ではない。 – jlliagre

+0

電話かどうかは、質問のwhileループと同じことをしていることです。 – hek2mgl

+0

@ hek2mglまあ、正直言って、最初の答えはOPループと同じことさえしていませんでした。なぜなら、スクリプトはその引数をパラメータではなく変数名から選ぶようです。私の最初の推測では、スクリプトが標準入力を排水して残りの発生を防ぐことができましたが、私は「ブロックされています」というステートメントを誤解しているようです。 – jlliagre

関連する問題