Linux: как рекурсивно заменить пробелы в названии файлов и директорий

Файлы с пробелами в имени иногда неудобно обрабатывать в скриптах, поэтому я стараюсь их не использовать. Но если есть директория, в которой находятся файлы с пробелами в именах, и хочется их все переименовать так, чтобы вместо пробелов использовались, например, символы подчеркивания, то в Linux это легко сделать с помощью утилиты find:
find /path_to_dir/ -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;
Флаг -depth указывает утилите, что сначала надо обрабатывать содержимое текущей директории, а только потом саму директорию (что позволяет нам сначала переимновать все файлы внутри директории и только потом ее саму); флаг -execdir позволяет выполнить слудующую за ним команду из текущей директории; rename - утилита, установленная в Ubuntu по умолчанию. В итоге find ищет в заданной директории все файлы и поддиректории с пробелами в именах, а rename - заменяет пробелы на подчеркивания.

С++: Безопасность относительно исключений при вызове функций

Этот пост - перевод статьи Герба Саттера: GotW #102: Exception-Safe Function Calls.

Простой вопрос

1. Что вы можете сказать о порядке выполнения функций f, g и h и выражений expr1 и expr2 в приведенных ниже фрагментах кода? Предпалагается, что expr1 и expr2 не содражат в себе вызовов других функций.
// Пример 1(a)
//
f( expr1, expr2 );
// Пример 1(b)
//
f( g( expr1 ), h( expr2 ) );

Вопросы посложнее

2. Разбирая доставшийся вам в наследство код, вы наткнулись на следующий фрагмент:
// Пример 2
 
// В заголовочном файле:
void f( T1*, T2* );
 
// В месте вызова:
f( new T1, new T2 );
Есть ли в этом коде проблемы с безопасностью относительно исключений или любые другие проблемы? Объясните.

3. Продолжая изучать старый код, вы обнаруживаете, что кому-то не нравился код, приведенный в примере 2, и позднее он был изменен на:
// Пример 3
 
// В заголовочном файле:
void f( std::unique_ptr<T1>, std::unique_ptr<T2> );
 
// В месте вызова:
f( std::unique_ptr<T1>{ new T1 }, std::unique_ptr<T2>{ new T2 } );
Какие улучшения привнес новый подход относительно старого (и привнес ли вообще)? Остались ли проблемы с безопасностью относительно исключений? Объясните.

4. Покажите, как можно реализовать функцию make_unique, которая бы решала проблемы с безопасностью в примере 3, и которую можно было бы вызывать следующим образом:
// Пример 4
 
// В заголовочном файле:
void f( std::unique_ptr<T1>, std::unique_ptr<T2> );
 
// В месте вызова:
f( make_unique<T1>(), make_unique<T2>() );