Это будет делать все правильно :
find -L . -type f -name "*.so" -print0 | while IFS= read -r -d '' FNAME; do
mv -- "$FNAME" "${FNAME%.so}.dylib"
done
Под правильно мы подразумеваем:
1) Будет переименовано только расширение файла (из-за использования ${FNAME%.so}.dylib
). Все остальные решения, использующие ${X/.so/.dylib}
, неверны, поскольку они неправильно переименовывают первое вхождение из .so
в имени файла (например, x.so.so
переименовано в x.dylib.so
или хуже, ./libraries/libTemp.so-1.9.3/libTemp.so
переименовано до ./libraries/libTemp.dylib-1.9.3/libTemp.so
- ошибка).
2) Он будет обрабатывать пробелы и любые другие специальные символы в именах файлов (кроме двойных кавычек).
3) Он не изменит каталоги или другие специальные файлы.
4) Он будет следовать по символическим ссылкам в подкаталогах и ссылкам на целевые файлы и переименовывать целевой файл, а не саму ссылку (стандартное поведение find - обработка самой символической ссылки, а не файла, на который указывает ссылка) .