Tru*_*ufa 8 bash scripts find msgfmt
我有以下目录结构:
webiste/
locale/
en/
LC_MESSAGES/
translation.po
de/
LC_MESSAGES/
translation.po
fr/
LC_MESSAGES/
translation.po
Run Code Online (Sandbox Code Playgroud)
我正在使用该find
命令获取所有.po
文件并将该msgfmt
命令应用于它们。
所以当我运行这个命令时:
find . -name \*.po
Run Code Online (Sandbox Code Playgroud)
输出是
./locale/fr/LC_MESSAGES/translation.po
./locale/de/LC_MESSAGES/translation.po
./locale/en/LC_MESSAGES/translation.po
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,但现在我添加以下内容时:
find . -name \*.po -exec msgfmt "{}" \;
Run Code Online (Sandbox Code Playgroud)
它不输出任何内容,也不会创建它应该创建的 .mo 文件(如果我单独对每个文件执行此操作,则msgfmt
命令按预期工作)。
这很奇怪,因为如果我将命令更改为:
找 。-name *.po -exec echo "{}" \;
它正确输出文件的名称。
我已经解决了这个问题:
find . -name \*.po -exec msgfmt "{}" -o {}.mo \;
Run Code Online (Sandbox Code Playgroud)
但它输出一个 translation.po.mo
如何才能做到这一点?
怎么样-execdir
?
这与-exec
它从找到文件的同一目录(而不是当前工作目录)运行命令不同。鉴于您只会translation.po
在 LC_MESSAGES 目录中找到一个文件,我们可以立即锁定内容,而不必大惊小怪地试图将扩展名从路径的末端截断。
find . -name \*.po -execdir msgfmt translation.po -o translation.mo \;
Run Code Online (Sandbox Code Playgroud)
小智 5
我正在使用这样的东西:
find . -name \*.po -execdir sh -c 'msgfmt "$0" -o `basename $0 .po`.mo' '{}' \;
Run Code Online (Sandbox Code Playgroud)
这也会删除 *.po 扩展名并添加 *.mo 扩展名。
更一般的(带空格的文件名):
find locale_dir/ -name \*.po -print -execdir sh -c 'msgfmt -f -o "$(basename "$0" .po).mo" "$0"' '{}' \;
Run Code Online (Sandbox Code Playgroud)