O comando cd
é executado em um sub shell e por isso efetivamente não faz nada. Portanto, o comando find
é executado a partir do diretório pai, uma vez para cada um dos nomes de subdiretório em XYZ_DV_L02*
. A primeira chamada de sed
altera a string em todos os arquivos, as seguintes invocações de sed
não localizam a string, mas são executadas de qualquer maneira.
Tente isto:
#!/bin/sh
for ii in XYZ_DV_L02* ; do
find "$ii" -iname "*.mvw" -type f -exec sed -i "
s/D3PLOT_1DForce_EffPlStrainMax_VonMisesMax/${ii}/g" "{}" +
done
Obrigado pela edição de Stéphane Chazelas
Embora tenha acabado de copiar o comando find
da questão apenas corrigindo o caminho, vale a pena explicar as alterações:
-
${ii}
foi sem aspas, agora é parte das aspas que contêm todo o argumentosed
. - Usar
+
em vez de\;
fará com quefind
execute um comandosed
para vários arquivos, não um para cada arquivo.
Editar
Para a solicitação do comentário, isso substituirá todas as seqüências do conjunto [-_a-zA-Z0-9]
seguido por .h3d
pelo texto de substituição, que é o nome do arquivo, incluindo a extensão .mvw
, que é como eu entendo o comentário. mas não parece útil. Se você quiser acessar o texto no padrão, poderá usar . Você pode ter que adaptar o conjunto para suas necessidades particulares.
#!/bin/sh
for ii in XYZ_DV_L02* ; do
find "$ii" -iname "*.mvw" -type f -exec sed -i -r "
s/([-_a-zA-Z0-9]+)\.h3d/${ii}.h3d/g" "{}" +
done