您不需要任何基本名稱也不需要循環; 您可以使用-type f
來避免find
報告其結果中的目錄以及-exec
選項直接執行您的命令。
像這樣的東西應該爲你的所有的MP4文件的工作:
find . -type f -name '*.mp4' -exec bash -c 'ffmpeg -i $0 -q 1 $0'_'%d.jpeg' {} \;
看到一個小的演示測試:
$ 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
正確處理。
相反,這樣的間隔文件將與for loop
打破。
如果你堅持用循環做這項工作,那麼這個必須是Fred建議的一個while循環。
作爲修改弗雷德的解決方案,你可以使用find
的-printf
能力避免使用基本名稱的:
while read -r -d '' file;do
ffmpeg -i "$file" -q 1 "${file}_%d.jpeg"
done < <(find . -name "*.mp4" -printf %f\\0)
-printf %f
根據find
打印手冊頁的文件名剝離,並追加\\0
(NULL字符)在每個文件名後,我們確保正確的文件名處理,即使名稱包含空格或其他特殊字符。
小測試:
$ 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
請注意,您可能需要將'ffmpeg'的標準輸入從'/ dev/null'重定向,以使其不會從'find'命令的輸出中讀取。 – chepner
我爲循環添加了一個文件描述符,並從'/ dev/null'重定向了'ffmpeg'輸入。 'ffmpep'實際上是從標準輸入中讀取的,還是更常見的預防措施? – Fred