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 quefindexecute um comandosedpara 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