Bash
如何將“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"' {} \; }
您在評論中給出的函式定義:
function fff { find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \; }
}
在應該結束函式定義之前缺少分號或換行符。轉義的分號不算;這只是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
是許多人更願意避免的非標準的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 {} \; }