如何将“find exec”命令作为函数添加到 bashrc 中?

如何将“find exec”命令作为函数添加到 bashrc 中?
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 {} \;
}

相关内容