Como usar o comando find com variáveis

0

Estou pesquisando arquivos por find ing um nome de arquivo parcial:

find /script -name '*file_topicv*'
/script/VER_file_topicv_32.2.212.1

Funciona, mas não quando o nome parcial do arquivo é uma variável:

var=file_topicv

find arquivo reportado não encontrado, (apesar do arquivo existente):

find /script -name '*$var*'

O que está errado aqui?

Eu também tentei estes:

find /script -name "*$var*"
find /script -name "*\$var*"
find /script -name "*\$var*"

mas não um desses trabalhos.

Atualização:

Acho que esse é o problema:

var=' find /tmp -name '*.xml' -exec sed -n 's/<Name>\([^<]*\)<\/Name>//p' {} +  |  xargs '

echo $var
generateFMN

ls  /script/VERSIONS | grep "$var"

NO OUTPUT

var=generateFMN
 ls  /script/VERSIONS | grep "$var"
VER_generateFMN_32.2.212.1

Então, por que $var do comando find causa o problema? (Eu removi os espaços por xargs .)

    
por yael 17.01.2018 / 11:00

1 resposta

3

A primeira citação dupla deve funcionar:

$ touch asdfghjkl
$ var=fgh
$ find -name "*$var*"
./asdfghjkl

Dentro de aspas simples ( '*$var*' ), a variável não é expandida e nem é expandida quando o sinal de dólar é escapado entre aspas duplas ( "*\$var*" ). Se você escapa duas vezes o sinal de cifrão ( "*\$var*" ), a variável é expandida, mas find também recebe uma barra invertida literal. (Mas find parece tomar a barra invertida como uma fuga novamente, por isso não muda o significado.)

Então, por mais confuso que seja, isso também funciona:

$ set -x
$ find -name "*\$var*"
+ find -name '*\fgh*'
./asdfghjkl

Você pode tentar executar todos os outros com set -x habilitado para ver quais argumentos find realmente obtém.

Como de costume, coloque o nome da variável entre chaves {} , se for seguido por letras, dígitos ou sublinhados, por exemplo "*${prefix}somename*" .

    
por 17.01.2018 / 11:16