我想使用该rename
命令根据用户在交互式脚本中输入(输入)的字符来删除文件基本名称上的字符。
基本上,我想这样做:
read characters_to_remove_inputted_by_the_user
rename 's/$characters_to_remove_inputted_by_the_user//g' file
但我在正确插入变量并在脚本执行期间保留命令结构时遇到问题。
答案1
假设——正如你自己的命令行所建议的——perl
的rename
实施(自 1989 年版本 3 起附带的示例脚本perl
,通常作为命令包含在许多操作系统中,有时作为与包分开的扩展的重写,perl
例如这个),有时会prename
在某些 Linux 发行版上调用,rename
否则那个来自util-linux
,可以使用环境:
STRING=$characters_to_remove_inputted_by_the_user rename 's/\Q$ENV{STRING}\E//g' ./*
以上内容为$characters_to_remove_inputted_by_the_user
壳变量作为值传递STRING
环境perl
使用 检索的变量$ENV{STRING}
。
或者,您可以使用export
shell 特殊内置命令,以便将该 shell 变量传递到它执行的每个命令的环境中,包括rename
:
export characters_to_remove_inputted_by_the_user
rename 's/\Q$ENV{characters_to_remove_inputted_by_the_user}\E//g' ./*
/\Q
是\E
为了确保$STRING
被视为固定字符串而不是正则表达式。如果您希望将其视为正则表达式,只需:
REGEXP=$characters_to_remove_inputted_by_the_user rename 's/$ENV{REGEXP}//g' ./*
避免以下情况:
重命名“s/$characters_to_remove_inputted_by_the_user//g”./*
上面的 shell 变量的内容在调用之前由 shell 展开rename
,因此这可能相当于命令注入漏洞,因为变量的值将被解释为perl
代码(例如像这样的值//;system("reboot");s/
)。
答案2
$ touch myfile1
$ ll
total 0
-rw-rw-r--. 1 fpm fpm 0 Mar 25 15:30 myfile1
$ read DELCHARS
my
$ rename -- "$DELCHARS" "" myfile1
$ ll
total 0
-rw-rw-r--. 1 fpm fpm 0 Mar 25 15:30 file1
$