Как создать копию файла в нескольких каталогах?

У меня есть структура папок

conf/ widget1/ env1.cfg env2.cfg widget2/ env1.cfg env2.cfg widget3/ env1.cfg env2.cfg widget4/ env1.cfg env2.cfg ... 

Я хочу найти все файлы с именем env2.cfg и создать их копию в каталоге с именем env3.cfg .

Я пробовал:

 find -name env2.cfg -exec cp '{}' "env3.cfg" ";" 

но это только что создало env3.cfg в env3.cfg conf/ .

Есть предположения?

Для уточнения я делаю это на Mac OSX, но в идеале одна и та же команда должна работать на CentOS, если это возможно.

Пытаться

find . -name env2.cfg -execdir cp {} env3.cfg \;

Заменив exec на execdir . Это будет означать, что ваше действие ( cp ) будет происходить внутри папки, где был найден файл ( env2.cfg ).

Ваш пример копирует все файлы env2.cfg в текущий рабочий каталог, который является «.». Вам нужно указать файлу новое имя, включая его каталог. Это работало для меня:

 for file in $(find . -name env2.cfg); do backup=$(echo $file | sed 's/env2.cfg/env3.cfg/'); cp $file $backup; done 

edit: Или еще более элегантный способ, поэтому вам не нужно беспокоиться о нескольких командах:

 for file in $(find . -name env2.cfg); do cp $file ${file/env2/env3}; done 

Поскольку это статическая структура, вы можете напрямую обращаться к именам файлов и разрешать оболочке копировать их:

 for f in conf/widget*/env2.cfg do cp "${f}" "${f/env2/env3}" done