Рекурсивно примените команду 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"' '{}' \;
Другие вопросы по тегам