次のディレクトリ構造があります。
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
を出力します
これをどのように行うことができますか?
-execdir
はどうですか?
これは-exec
とは異なり、ファイルを見つけるのと同じディレクトリ(現在の作業ディレクトリではなく)からコマンドを実行します。 LC_MESSAGESディレクトリでtranslation.po
ファイルが1つしか見つからない場合は、すぐにロックすることができ、拡張機能をパスの最後からスナップしようとする必要はありません。
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"' '{}' \;