Bash

如何將“find exec”命令作為函式添加到 bashrc?

  • February 21, 2022
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 {} \;
}

引用自:https://unix.stackexchange.com/questions/475210