Рекурсивно примените команду msgfmt ко всем файлам.po в каталоге с помощью команды find -exec.
У меня есть следующая структура каталогов:
webiste/
locale/
en/
LC_MESSAGES/
translation.po
de/
LC_MESSAGES/
translation.po
fr/
LC_MESSAGES/
translation.po
Я использую find
Команда, чтобы добраться до всех .po
файлы и применить msgfmt
командовать им.
Поэтому, когда я запускаю эту команду:
find . -name \*.po
Выход
./locale/fr/LC_MESSAGES/translation.po
./locale/de/LC_MESSAGES/translation.po
./locale/en/LC_MESSAGES/translation.po
Как и ожидалось, но теперь я, когда я добавляю это:
find . -name \*.po -exec msgfmt "{}" \;
Он ничего не выводит и не создает.mo файлы, которые он должен (Если я делаю это для каждого файла в отдельности, msgfmt
команда работает как положено).
Это странно, так как, если я изменю команду на это:
находить. -name *.po -exec echo "{}" \;
Он выводит имена файлов правильно.
Я вроде как решил это так:
find . -name \*.po -exec msgfmt "{}" -o {}.mo \;
Но это выводит translation.po.mo
Как это может быть сделано?
2 ответа
Как насчет -execdir
?
Это отличается от -exec
тем, что он запускает команду из того же каталога, в котором он находит файлы (а не из текущего рабочего каталога). Учитывая, что вы собираетесь найти только один translation.po
файл в ваших каталогах LC_MESSAGES, мы можем заблокировать вещи без необходимости возиться с попыткой сорвать расширение с конца пути.
find . -name \*.po -execdir msgfmt translation.po -o translation.mo \;
Я использую что-то вроде этого:
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"' '{}' \;