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)
您在评论中给出的函数定义:
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)
归档时间: |
|
查看次数: |
450 次 |
最近记录: |