find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \;
当我手动运行上面的命令时,它工作得很好,但我无法将它放在.bashrc
文件中的函数中。接收unexpected end of line
错误。
function fff { find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \; }
答案1
您在评论中给出的函数定义:
function fff { find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \; }
}
在应该结束函数定义的the 之前缺少分号或换行符。转义的分号不算数;这只是find
结束-exec
初选的一个论点。这应该有效:
function fff { find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \; ; }
# semicolon here: ^^^
...但是仍然存在一些问题。首先,正如 @Kusalananda 在评论中所说,将文件名直接注入 shell 命令是{}
不安全的;您应该将其作为参数传递并使用它(如"$1"
等)。您已经这样做了,但是$0
-- 这实际上应该是命令/函数/等名称,而不是常规参数,因此最好将其他内容(例如find-bash
)传递为$0
,并让实际参数为$1
。
其次(@Kusalananda 再次指出),${1/.mov}
如果文件名中其他位置有“.mov”,则使用删除旧的“.mov”后缀可能会出现故障;${1%.mov}
会专门从末尾删除它。
第三(也是更不重要的)function
是许多人宁愿避免的非标准的羞辱;标准语法是funcname() definition
.我还喜欢使用换行符而不是分号来分隔命令。完成所有这些修复后,这就是我所拥有的:
fff() {
find . -name "*.mov" -exec bash -c 'echo ffmpeg -i "$1" -c:v libx264 -crf 20 -pix_fmt yuv420p "${1%.mov}.mp4"' find-bash {} \;
}