web-dev-qa-db-ja.com

find -execを使用して、ディレクトリ内のすべての.poファイルにmsgfmtコマンドを再帰的に適用します

次のディレクトリ構造があります。

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を出力します

これをどのように行うことができますか?

6
Trufa

-execdirはどうですか?

これは-execとは異なり、ファイルを見つけるのと同じディレクトリ(現在の作業ディレクトリではなく)からコマンドを実行します。 LC_MESSAGESディレクトリでtranslation.poファイルが1つしか見つからない場合は、すぐにロックすることができ、拡張機能をパスの最後からスナップしようとする必要はありません。

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

私はこのようなものを使用しています:

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"' '{}' \;
3
HonzaMac