Aplicar recursivamente o comando msgfmt a todos os arquivos .po no diretório com find -exec

6

Eu tenho a seguinte estrutura de diretórios:

webiste/
    locale/
        en/
             LC_MESSAGES/
                     translation.po
        de/
            LC_MESSAGES/
                     translation.po
        fr/
            LC_MESSAGES/
                     translation.po

Estou usando o comando find para acessar todos os arquivos .po e aplicar o comando msgfmt a eles.

Então, quando eu executo este comando:

find . -name \*.po

A saída é

./locale/fr/LC_MESSAGES/translation.po
./locale/de/LC_MESSAGES/translation.po
./locale/en/LC_MESSAGES/translation.po

Assim como esperado, mas agora eu adiciono isso:

find . -name \*.po -exec msgfmt "{}" \;

Não produz nada e não cria os arquivos .mo que deve (se eu fizer isso para cada arquivo individualmente, o comando msgfmt funciona como esperado).

Isso é estranho, pois se eu mudar o comando para isso:

encontre. -name * .po -exec echo "{}" \;

Exibe os nomes dos arquivos corretamente.

Eu meio que resolvi assim:

find . -name \*.po -exec msgfmt "{}" -o {}.mo \;

Mas gera um translation.po.mo

Como isso pode ser feito?

    
por Trufa 10.04.2013 / 18:00

2 respostas

6

Que tal -execdir ?

Isso difere de -exec em que ele executa o comando no mesmo diretório em que encontra os arquivos (em vez do diretório de trabalho atual). Dado que você só vai encontrar um arquivo translation.po em seus diretórios LC_MESSAGES, podemos bloquear as coisas diretamente e não ter que se preocupar em tentar tirar a extensão do final do caminho.

find . -name \*.po -execdir msgfmt translation.po -o translation.mo \;
    
por Oli 10.04.2013 / 18:08
3

Estou usando algo assim:

find . -name \*.po -execdir sh -c 'msgfmt "$0" -o 'basename $0 .po'.mo' '{}' \;

Isso também remove a extensão * .po e adiciona a extensão * .mo.

Mais geralmente (nomes de arquivos com espaços):

find locale_dir/ -name \*.po -print -execdir sh -c 'msgfmt -f -o "$(basename "$0" .po).mo" "$0"' '{}' \;
    
por HonzaMac 11.06.2014 / 08:51