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
脚本的完整代码:完整脚本
答案1
您的错误来自脚本中的以下行:
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
会get_file_folder_name
全局设置它。
也可以看看: