Вместо того, чтобы полагаться на внешние команды, когда вы теряете информацию о текущем каталоге, вы можете использовать опцию find ' -execdir чтобы он выполнял команды в каталоге, в котором был найден файл.
find . -name oldfile.txt -execdir mv -- {} newfile.txt \;
На самом деле это более безопасная версия -exec которая предпочтительна в большинстве ситуаций. Единственным недостатком является то, что он не указан в POSIX, поэтому вы не найдете его во всех вариантах find - но, по крайней мере, в GNU find и BSD find вы можете.
Если вы хотите быть более безопасным, вы должны вызывать mv как mv -- source target чтобы файл, начинающийся с тире, не был неправильно интерпретирован как аргумент mv .
Если по какой-то причине вы не хотите использовать -execdir или выполнять другие сложные действия, или просто хотите немного узнать о Bash, вот как получить папку и переместить файл на основе этого:
find . -name oldfile.txt -exec bash -c 'mv -- "${0}" "$(dirname $0)"/newfile.txt' {} \;
Здесь {} передает полный путь к bash как $0 . Мы получаем его имя каталога с помощью подстановки команд ($(…)), а затем добавляем новое имя. И исходный аргумент, и имя каталога должны быть заключены в двойные кавычки, чтобы пробел не нарушал команду - в противном случае mv подумает, что вы пытаетесь переместить два файла с именем foo и bar когда файл фактически называется, например, foo bar .