私はこのような考えをしました。特定の条件を確認するbashスクリプトを実行し、それを使用してffmpeg
ディレクトリ内のすべてのビデオをすべての形式からすべての形式に変換すると、.mkv
うまく機能します!
問題は、for file in
ループが再帰的に機能しないことです。https://stackoverflow.com/questions/4638874/how-to-loop-through-a-directory-recursively)
しかし、私は「パイプライン」をほとんど理解しておらず、例を見て不確実性を一部解消できることを期待しています。
このシーンが頭の中に浮かび上がったのですが、理解するのに多くの役に立ったと思います。
次のbashスクリプトの断片があるとしましょう。
for file in *.mkv *avi *mp4 *flv *ogg *mov; do
target="${file%.*}.mkv"
ffmpeg -i "$file" "$target" && rm -rf "$file"
done
これは、現在のディレクトリの*.mkv *avi *mp4 *flv *ogg *mov
拡張子を検索し、出力を宣言してから.mkv
ソースファイルを削除し、出力を元のビデオと同じフォルダに保存することです。
これを再帰的に実行するようにどのように変換できますか?を使用している場合、
find
変数をどこで宣言しますか$file
?どこに報告する必要がありますか$target
?find
本当にすべて一行でしょうか?$file
条件付きチェックを実行する必要があるため、ファイルを変数に渡す必要があります。そして、(1)が成功すると仮定すると、「出力は元のビデオを持つ同じフォルダに保存する必要があります」という要件が満たされているかどうかを確認できますか?
ベストアンサー1
POSIXを使って以下を見つけてください。
find . \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o \
-name '*ogg' -o -name '*mov' \) -exec sh -c '
for file do
target="${file%.*}.mkv"
echo ffmpeg -i "$file" "$target"
done' sh {} +
echo
使用したいコマンドに置き換えます。
GNU検索またはBSD検索がある場合は、次のものを使用できます-regex
。
find . -regex '.*\.\(mkv\|avi\|mp4\|flv\|ogg\|mov\)'