Tente
find . -name env2.cfg -execdir cp {} env3.cfg \;
Substituindo exec
para execdir
. Isso significará que sua 'ação' ( cp
) ocorrerá dentro da pasta onde o arquivo ( env2.cfg
) foi encontrado.
Eu tenho uma estrutura de pastas
conf/
widget1/
env1.cfg
env2.cfg
widget2/
env1.cfg
env2.cfg
widget3/
env1.cfg
env2.cfg
widget4/
env1.cfg
env2.cfg
...
O que eu quero fazer é encontrar todos os arquivos chamados env2.cfg
e criar uma cópia deles em seu diretório chamado env3.cfg
.
Eu tentei:
find -name env2.cfg -exec cp '{}' "env3.cfg" ";"
mas isso criou env3.cfg
no diretório conf/
.
Alguma opinião?
Para esclarecimentos, estou fazendo isso no Mac OSX, mas o ideal é que o mesmo comando funcione no CentOS, se possível.
Seu exemplo copia todos os arquivos env2.cfg para o diretório de trabalho atual, que é ".". Você precisa dar o arquivo encontrou um novo nome, incluindo o seu diretório. Este trabalhou para mim:
for file in $(find . -name env2.cfg); do backup=$(echo $file | sed 's/env2.cfg/env3.cfg/'); cp $file $backup; done
edite: Ou a maneira ainda mais elegante, para que você não precise se preocupar com vários comandos:
for file in $(find . -name env2.cfg); do cp $file ${file/env2/env3}; done
Como é uma estrutura estática, você pode endereçar diretamente os nomes dos arquivos e deixar que eles sejam copiados:
for f in conf/widget*/env2.cfg
do
cp "${f}" "${f/env2/env3}"
done