状態:
- macOS 10.13.6の実行とbash 5.0.17(1)の使用
- 複数のファイルを含む多くのサブディレクトリ。
- サブディレクトリで特定の拡張子(.avi)を持つファイルをフィルタリングする必要があります。
- すべての.aviファイルは.mp4を使用して処理してリミックスする必要があります
ffmpeg
。ffmpeg
リミックスするには、次の構文を使用してください。ffmpeg -i in.avi -c copy out.mp4
- 出力形式:ソース.aviファイルと同じフォルダにあり、同じファイル名を使用します(拡張子.aviを除く)。
ファイル構造の例:
$ find . -maxdepth 2
.
./abc
./abc/abc.avi
./xyz
./xyz/xyz.avi.mp4
./123
./123/123.avi
この場合、ファイルの合計をフィルタリング./abc/abc.avi
し、./123/123.avi
正規表現の合計を使用してこれを実行できますfind
。
$ find -E . -iregex ".*\.avi"
./abc/abc.avi
./123/123.avi
目的のリミックス.mp4
出力ファイル名は次のとおりです。
./abc/abc.mp4
./123/123.mp4
私がすることができます:
- スクリプトを使用して1つのコマンドでこれらのファイルをすべてコンテナに
.avi
リミックスしますか.mp4
?目的の出力ファイル名を指定しながら、出力をfind
入力にパイプする方法がわかりません。ffmpeg
- 元の
.avi
ファイルを削除しても再多重化に成功した場合にのみ該当しますか?
ベストアンサー1
私はArch Linuxユーザーではなく、この答えをArch Linux環境で書いていますが、ffmpeg
FreeBSDとMacOS-Xでは2つの要件を満たすことができます。たとえば、次のようになります。bash
$ from=avi; to=mp4;
$ find -E . -type f -iregex ".*\.avi" -execdir \
sh -c 'file=$(basename $3); (ffmpeg -i $file.$1 -c copy $file.$2) 2>/dev/null && \rm $3' shellproc "$from" "$to" {} \;
上記の行から:
-type f
以前に含めました。 「一般ファイル」タイプのファイルのみを実行すると時間が節約さ-iregex ...
れます。stat
$1
代表する$from
$2
代表する$to
$3
コマンド{}
の結果を示します。find
shellproc
inは、...shellproc "$from" "$to" {} \;
次のコマンドを使用して実行されるシェルプロセスを識別するために使用されるランダムな表示ですsh -c 'file=$(basename $3); (ffmpeg -i $file.$1 -c copy $file.$2) 2>/dev/null && \rm $3'
。このラベルは、シェルから出力されるすべてのエラーメッセージの前に付けられます。これがすることです。
欲しいものを達成する方法はいくつかあります。ぜひご覧ください。回答著者:Kusalalananda、フレーズの詳細を学びますfind ... -exec...
。