使用 find -exec 将 msgfmt 命令递归应用于目录中的所有 .po 文件

使用 find -exec 将 msgfmt 命令递归应用于目录中的所有 .po 文件

我有以下目录结构:

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

如何才能做到这一点?

答案1

怎么样-execdir

-exec这与它从找到文件的同一目录(而不是当前工作目录)运行命令不同。鉴于您只会translation.po在 LC_MESSAGES 目录中找到一个文件,我们可以锁定一切,而不必费尽心思尝试将扩展名从路径末尾移除。

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

答案2

我正在使用这样的东西:

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

相关内容