スクリプトが再帰的に適用されるように、「for file in」を「find」に変換します。

スクリプトが再帰的に適用されるように、「for file in」を「find」に変換します。

私はこのような考えをしました。特定の条件を確認する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ソースファイルを削除し、出力を元のビデオと同じフォルダに保存することです。

  1. これを再帰的に実行するようにどのように変換できますか?を使用している場合、find変数をどこで宣言しますか$file?どこに報告する必要がありますか$targetfind本当にすべて一行でしょうか?$file条件付きチェックを実行する必要があるため、ファイルを変数に渡す必要があります。

  2. そして、(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\)'

おすすめ記事