cp не правильно оценивает имя dirname в операции поиска

Я пытаюсь создать скрипт, который найдет файлы определенного имени файла, скопирует файл в его местоположение и удалит найденный файл.

Игнорируя часть удаления сейчас, это то, что у меня есть до сих пор:

find /path/to/searchdir -name "file.rtf" -exec cp -v "/path/to/filetocopy.rtf" `dirname {}` \; 

К сожалению, я не могу заставить его правильно оценить имя dirname, так как он возвращает «.». для любых экземпляров файла, который он находит.

Я уверен, что это что-то простое, но я все еще новичок, когда дело доходит до сценариев bash, поэтому я не знаю, почему. Я пробовал различные варианты выше, но безрезультатно.

find -s -execdir кажется более подходящим:

 find /path/to/searchdir -name file.rtf -execdir cp -v /path/to/filetocopy.rtf . \; 

Это запустит cp из каждого найденного каталога, содержащего файл с именем file.rtf . как видно из cp будет являться соответствующим каталогом каждый раз, когда выполняется cp .

Затем вы можете добавить -delete для удаления файла (после проверки всех действий).

Причина, по которой ваш подход не работает, заключается в том, что оболочка оценивает имя dirname {} перед запуском find и dirname {} . , Так

 find /path/to/searchdir -name "file.rtf" -exec cp -v "/path/to/filetocopy.rtf" `dirname {}` \; 

становится

 find /path/to/searchdir -name "file.rtf" -exec cp -v "/path/to/filetocopy.rtf" . \;