通过重命名命令使用变量

通过重命名命令使用变量

我想使用该rename命令根据用户在交互式脚本中输入(输入)的字符来删除文件基本名称上的字符。

基本上,我想这样做:

read characters_to_remove_inputted_by_the_user

rename 's/$characters_to_remove_inputted_by_the_user//g' file

但我在正确插入变量并在脚本执行期间保留命令结构时遇到问题。

答案1

假设——正如你自己的命令行所建议的——perlrename实施(自 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}

或者,您可以使用exportshell 特殊内置命令,以便将该 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

util-linux rename

$ 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
$ 

相关内容