使用 find 和 xargs 时从 ffmpeg 重命名输出文件名
Renaming the output file name from ffmpeg when using find and xargs
我正在尝试重命名来自我使用 find 和 xargs 生成的 ffmpeg 进程的输出文件。我有一个文件目录,我想将其转换为某种格式,所有这些文件最终都应命名为 .mov。所以我过滤掉 .mp4 和 .mov 文件,然后使用 xargs 将其传递给 ffmpeg。
假设当前工作目录中有 abc.mp4、abcd.mp4、abcde.mp3、bcd.mov 等文件,然后我正在做类似的事情来过滤掉 mp4 和 mov文件并将其传递给 ffmpeg 进行编码:
find . -type f -name "*.mp4" -o -name "*.mov" | xargs -n 1 -p 5 -I '{}' ffmpeg -i '{}' ....... $PWD/{}"_h264.mov"
这将执行我希望 ffmpeg 执行的操作,但它会将文件命名为
abc.mp4_h264.mov,abcd.mp4_h264.mov,bcd.mov_h264.mov
我理想中想要实现的是将输出文件命名为
abc_h264.mov,abcd_h264.mov,bcd_h264.mov
在我指定 ffmpeg 的输出文件的地方,我没有想到如何做到这一点。我知道我可以像这样使用 xargs 调用 basename 命令
find . -type f -name "*.mp4" -o -name "*.mov" | xargs -n 1 basename | rev | cut -d . -f 2 | rev
并提取不带扩展名的文件名,但如果我使用它,那么我如何将它作为输入文件传递给 ffmpeg,因为当它从 xargs 出来时它会丢失扩展名,而 ffmpeg 将抛出错误。
任何人都可以帮助我一次性实现这一点,我可以指定 'basename' 在做什么,但我在哪里指定 ffmpeg 的输出文件名?
非常感谢您提供的任何帮助。非常感谢社区。
请您尝试以下操作:
find . -type f -name "*.mp4" -o -name "*.mov" | xargs -I {} -n 1 -P 5 bash -c 'org="{}"; new="$PWD/${org%.*}_h264.mov"; ffmpeg -i "$org" {options} "$new"'
但是生成 bash
命令作为子进程效率不高
多次。如果您没有特定理由使用 find
和xargs
,这样说会更简单:
for org in *.mp4 *.mov; do
new="$PWD/${org%.*}_h264.mov"
ffmpeg -i "$org" {options} "$new"
done