find . -name '*.php' -print
imprime a lista de nomes de arquivos. É aí que xargs
recebe sua entrada.
Para evitar surpresas desagradáveis com nomes de arquivos contendo espaço em branco e outros caracteres especiais, use -print0
e xargs -0
find . -name '*.php' -print0 | xargs -0 xgettext -j --from-code=UTF-8 -o "$TARGET/$LPATH/$POFILE"
ou use a ação -exec
:
find . -name '*.php' -exec xgettext -j --from-code=UTF-8 -o "$TARGET/$LPATH/$POFILE" {} +
Tenha em atenção que, se existirem muitos ficheiros, xgettext
será executado várias vezes, uma vez por lote de ficheiros. Isso acontece se você usou xargs
ou -exec
. Para evitar isso, já que você está usando o bash, use o recurso de passagem de diretório recursivo integrado em vez de find
.
shopt -s globstar
xgettext -j --from-code=UTF-8 -o "$TARGET/$LPATH/$POFILE" **/*.php
Dessa forma, se os nomes de arquivos concatenados passarem pelo limite de comprimento da linha de comando, você receberá um erro em vez de um arquivo silenciosamente truncado. Cuidado com o bash, **/
atravessa links simbólicos para diretórios, não apenas diretórios. Se isso for um problema, use ksh ou zsh em vez de bash ou use um método diferente.
Com find
, para evitar a substituição silenciosa do arquivo de saída repetidamente, grave na saída padrão e redirecione todo o comando find
para um arquivo.
find . -name '*.php' -exec xgettext -j --from-code=UTF-8 {} + >"$TARGET/$LPATH/$POFILE"
find
lista os arquivos na ordem em que os encontra, não faz nenhuma classificação. Nem classificação por nome nem classificação de diretórios antes ou depois de outros arquivos. (Diretórios são arquivos. Não há uma lista separada de subdiretórios e de outros arquivos em um diretório.)
find
sempre lista o conteúdo de um diretório imediatamente após o próprio diretório. Com a opção -depth
, isso é revertido: primeiro o conteúdo de um diretório, depois o próprio diretório.