Bash
包含空格的文件名的 sed 無效選項錯誤
BASE_NAME="$(basename "${1}")" FILE_NEW="$(echo "${BASE_NAME}" | sed -e "${REPLACE}")"
這裡 $1 指的是傳遞給函式 REPLACE 變數的文件名:
REPLACE='s/\[NOW\]/'${NOW}'/g;s/\[TODAY\]/'${TODAY}'/g;s/\[DATETIME\]/'${DATETIME}'/g;s/\[RANDOM\]/'${RANDOM_NUMBER}'/g;s/\[NAME\]/'${NAME}'/g;s/\[FILENAME\]/'${FILENAME}'/g'
我想要做的是通過替換上述模式用 sed 運算符修改文件名。但是當我遇到一個包含空格後跟“-”的文件時,它們就會出現問題。例如,查看以下文件名:
file -2.txt file -3.txt file -e.txt
在所有這些情況下,拋出的錯誤如下:
sed: invalid option -- '2' sed: invalid option -- '3' sed: -e expression #1, char 1: unknown command: `.'
如果文件名只是包含空格並且沒有“-”仍然存在問題:
file name.txt
會給出以下錯誤:
sed: can't read ./file: No such file or directory sed: can't read name.txt: No such file or directory
腳本的完整程式碼:完整腳本
您的錯誤來自腳本中的以下行:
sed -i $REPLACE $1
這是同時使用
REPLACE
變數和不帶$1
引號的,這意味著 shell 會將它們拆分為空格、製表符和換行符上的單詞(然後額外處理這些單詞以用於文件名通配模式)。然後這些詞將作為單獨的參數提供給sed
.你可能會逃脫使用
sed -i -e "$REPLACE" -- "$1"
您的
clone_directory
函式中還有幾個未引用的變數:rename_file ${dir_name} ROOT=$FILE_NEW cd $ROOT
以及在您的
replace_tags
函式中(請注意,{...}
通常不需要使用周圍的變數名稱,也不等同於引用變數)。另請注意,shell 選項不是函式的本地選項,因此設置
extglob
inget_file_folder_name
會將其設置為全域。也可以看看: