状態:
- 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...
。
答え2
~に帰属Cbhiheの答え、それが私を正しい道に導いたからです。 Macでは、ベースラインがどのように機能するのか、ファイル名の空白があるため、いくつかの変更を行う必要がありました。
macOSはfind
やや特別な構文を使用します。次の1行を使用できます。
find -E . -type f -iregex ".*\.avi" -execdir bash -c 'in=$1; out=${in%.*}.mp4; (ffmpeg -y -i "$in" -c copy "$out") 2>/dev/null && \rm "$in"' shellproc {} \;
find -E . -type f -iregex ".*\.avi"
ファイル検索:.
現在ディレクトリを検索していることを示します。-E
正規表現を使用した拡張検索が許可されることを示します。-iregex ".*\.avi"
サブディレクトリを含む、このパス内のすべての「.aviz」ファイルを検索します。
-execdir bash -c '<COMMAND>' shellproc {} \;
bashシェルを使用して各検索結果に対してコマンドを実行し、検索結果と同じディレクトリで実行します。ファイル名は$ 1パラメーターとして渡されます。in=$1; out=${in%.*}.mp4; (ffmpeg -y -i "$in" -c copy "$out") 2>/dev/null && \rm "$in"
入出力ファイル名を定義し、リミックスのためにffmpegを実行し、詳細なffmpeg出力を抑制し、リミックスが正常に完了した場合にのみ入力ファイルを削除します。
Linuxシステムでは、find
構文が少し異なります。
find . -type f -regex ".*\.avi" -execdir bash -c 'in=$1; out=${in%.*}.mp4; (ffmpeg -y -i "$in" -c copy "$out") 2>/dev/null && \rm "$in"' shellproc {} \;