Я использую что-то вроде этого:
find . -name \*.po -execdir sh -c 'msgfmt "$0" -o `basename $0 .po`.mo' '{}' \;
Это также удаляет расширение * .po и добавляет расширение * .mo.
Более общее (имена файлов с пробелами):
find locale_dir/ -name \*.po -print -execdir sh -c 'msgfmt -f -o "$(basename "$0" .po).mo" "$0"' '{}' \;