Usando uma variável com o comando rename

1

Eu quero usar o comando rename para remover caracteres em um nome de base de arquivo, com base nos caracteres inseridos (entrada) pelo usuário em um script interativo.

Basicamente, gostaria de fazer isso:

read characters_to_remove_inputted_by_the_user

rename 's/$characters_to_remove_inputted_by_the_user//g' file

Mas estou tendo problemas para inserir corretamente a variável e manter a estrutura de comando durante a execução do script.

    
por Vinh Francis Guyait 25.03.2017 / 19:26

2 respostas

2

Assumindo - como sua própria linha de comando sugere - perl ' rename implementation (um script de exemplo fornecido com perl desde a versão 3 em 1989 e geralmente incluído como um comando em muitos sistemas operacionais, às vezes como uma regravação com extensões separadas do pacote perl like este ), às vezes chamado de prename em algumas distribuições Linux onde rename é de outra forma o de util-linux , você pode usar o ambiente:

STRING=$characters_to_remove_inputted_by_the_user rename 's/\Q$ENV{STRING}\E//g' ./*

Acima, o conteúdo da variável $characters_to_remove_inputted_by_the_user shell é passado como o valor da variável STRING ambiente que perl recupera com $ENV{STRING} .

Como alternativa, você pode usar o% especialexport shell embutido para que essa variável shell seja passada no ambiente de cada comando executado, incluindo rename :

export characters_to_remove_inputted_by_the_user
rename 's/\Q$ENV{characters_to_remove_inputted_by_the_user}\E//g' ./*

Os \Q / \E devem garantir que $STRING seja tratado como uma string fixa e não como uma expressão regular. Se você quer que seja tratado como um regexp, é só:

REGEXP=$characters_to_remove_inputted_by_the_user rename 's/$ENV{REGEXP}//g' ./*

Evite coisas como:

rename "s/$characters_to_remove_inputted_by_the_user//g" ./*

Acima, o conteúdo da variável shell é expandido pelo shell antes de chamar rename , de modo que poderia equivaler a uma vulnerabilidade de injeção de comando, pois o valor da variável seria interpretado como perl code (por exemplo, um valor como //;system("reboot");s/ ).

    
por 25.03.2017 / 19:55
1

Com 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
$ 
    
por 25.03.2017 / 20:35