これにはベース名もループも必要ありません。 -type f
を使用して、のディレクトリを報告し、結果を-exec
オプションと組み合わせてコマンドを直接実行することを避けることができます。
このような何かが、すべてのMP4ファイルのために働く必要があります:あなたは第二のファイルは、ファイル名にスペースを持っていますが、ある見ることができるように
$ find . -type f -name 'a*.txt' -exec bash -c 'echo ffmpeg -i $0 ' {} \;
ffmpeg -i ./a.txt
ffmpeg -i ./a spaced file.txt
ffmpeg -i ./aa.txt
ffmpeg -i ./cheatsheets/awk-cheat-sheet-gv.txt
:
find . -type f -name '*.mp4' -exec bash -c 'ffmpeg -i $0 -q 1 $0'_'%d.jpeg' {} \;
は小さなデモテストを参照してください。 find
によって正しく処理されます。
そのような間隔のあるファイルは、for loop
で壊れます。
このジョブをループで作成することを主張する場合は、これはFredからアドバイスされたwhileループでなければなりません。あなたはfind
の-printf
機能を使用して、ベース名の使用を避けることができフレッド・ソリューションへの変形例として
:
find
印刷物のmanページによると
while read -r -d '' file;do
ffmpeg -i "$file" -q 1 "${file}_%d.jpeg"
done < <(find . -name "*.mp4" -printf %f\\0)
-printf %f
は、ファイル名が取り除かれ、\\0
(ヌル文字を追加します)各ファイル名の後に、名前にスペースやその他の特殊文字が含まれていても、正しいファイル名の扱いを保証します。
小テスト:
$ while read -r -d '' file;do echo "ffmpeg -i $file -q 1 ${file}_%d.jpeg";done < <(find . -name "a*.txt" -printf %f\\0)
ffmpeg -i a.txt -q 1 a.txt_%d.jpeg
ffmpeg -i a spaced file.txt -q 1 a spaced file.txt_%d.jpeg
ffmpeg -i aa.txt -q 1 aa.txt_%d.jpeg
ffmpeg -i awk-cheat-sheet-gv.txt -q 1 awk-cheat-sheet-gv.txt_%d.jpeg
'/ dev/null'から' ffmpeg'の標準入力を 'find'コマンドの出力から読み込まないようにリダイレクトする必要があるかもしれないことに注意してください。 – chepner
ループのファイル記述子を追加し、 '/ dev/null'から' ffmpeg'入力をリダイレクトしました。 'ffmpep'は実際に標準入力から読み込まれますか、それとももっと一般的な予防策ですか? – Fred