web-dev-qa-db-fra.com

Appliquez récursivement la commande msgfmt à tous les fichiers .po du répertoire avec find -exec

J'ai la structure de répertoire suivante:

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

J'utilise la commande find pour accéder à tous les fichiers .po et leur appliquer la commande msgfmt.

Alors quand je lance cette commande:

find . -name \*.po

La sortie est

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

Juste comme prévu mais maintenant je quand j'ajoute ceci:

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

Il ne génère rien et ne crée pas les fichiers .mo qu'il est censé créer (si je le fais pour chaque fichier individuellement, la commande msgfmt fonctionne comme prévu).

C'est bizarre puisque si je change la commande en ceci:

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

Il affiche les noms des fichiers correctement.

Je l'ai en quelque sorte résolu comme ceci:

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

Mais il sort un translation.po.mo

Comment cela peut-il être fait?

6
Trufa

Qu'en est-il de -execdir?

Cela diffère de -exec en ce qu'il exécute la commande à partir du même répertoire que celui où sont trouvés les fichiers (plutôt que le répertoire de travail actuel). Etant donné que vous ne trouverez qu'un fichier translation.po dans vos répertoires LC_MESSAGES, nous pouvons verrouiller les éléments sans avoir à vous soucier d'essayer de casser l'extension à la fin du chemin.

find . -name \*.po -execdir msgfmt translation.po -o translation.mo \;
6
Oli

J'utilise quelque chose comme ça:

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

Cela supprime également l'extension * .po et ajoute l'extension * .mo.

Plus généralement (noms de fichiers avec des espaces):

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