如何将 find exec 命令添加到 bashrc 中?

bis*_*bas -1 bash find function bashrc exec

find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \;
Run Code Online (Sandbox Code Playgroud)

当我手动运行它时,上面的命令可以完美运行,但我无法将它放在.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"' {} \; }
Run Code Online (Sandbox Code Playgroud)

Gor*_*son 5

您在评论中给出的函数定义:

function fff { find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \; }
Run Code Online (Sandbox Code Playgroud)

}应该结束函数定义之前缺少分号或换行符。转义的分号不算;这只是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: ^^^
Run Code Online (Sandbox Code Playgroud)

……但仍然存在一些问题。首先,正如@Kusalananda 在评论中所说,将文件名直接注入 shell 命令{}是不安全的;您应该将其作为参数传递并使用它(如"$1"等)。您已经这样做了,但是作为$0- 这实际上应该是命令/函数/等名称,而不是常规参数,因此最好将其他内容(例如find-bash)作为传递$0,并将实际参数设为$1.

其次(再次由@Kusalananda 指出),${1/.mov}如果文件名在名称中的其他位置包含“.mov” ,则使用删除旧的“.mov”后缀可能会出现故障;${1%.mov}将从末尾专门删除它。

第三(更不重要的一点)function是许多人喜欢避免的非标准的 bashism;标准语法是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 {} \;
}
Run Code Online (Sandbox Code Playgroud)

  • 最好使用 `"${1%.mov}"` 来确保它是我们要删除的文件名后缀,而不仅仅是文件路径中任何位置的一些 `.mov`。还可以使用`bash` 或`find-bash` 或类似`$0` 的东西而不是`-`。此字符串将用于嵌入脚本生成的任何错误消息。见 https://unix.stackexchange.com/questions/156008 (2认同)