С помощью util-linux
переименовать
:
$ 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
$
Предположим - как предлагает ваша собственная командная строка - perl
реализация переименовать
(пример сценария, поставляемый с perl
, начиная с версии 3 в 1989 г. и часто включается в качестве команды во многие ОС, иногда в виде перезаписи с расширениями, отдельными от пакета perl
, например этот ), иногда называемым prename
в некоторых дистрибутивах Linux, где переименовать
в противном случае это имя из 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
, чтобы эта переменная оболочки передавалась в окружение каждой выполняемой команды, включая переименование
:
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»./ *
Выше содержимое переменной оболочки расширяется оболочкой перед вызовом переименовать
, так что это может быть уязвимостью внедрения команды, так как значение переменной будет интерпретируется как код perl
(подумайте, например, о таком значении, как //; system ("reboot"); s /
).