locate -e0 '*/pg_type.h' | xargs -r0 cat
locate pg_type.h
encontraria todos os arquivos com pg_type.h
em seu caminho (assim, por exemplo, se houvesse um diretório rpg_type.horn
, você acabaria exibindo todos os arquivos lá).
Sem -0
, a saída de locate
não pode ser pós-processada porque os arquivos são separados por caracteres de nova linha, enquanto a nova linha é um caractere perfeitamente válido em um nome de arquivo.
cat
sem argumentos grava para stdout o que lê de stdin, portanto locate | cat
seria o mesmo que locate
, cat
passaria a saída de locate
. O que você precisa é passar a lista de arquivos como argumentos para cat
.
É para isso que normalmente utiliza xargs
: converte um fluxo de dados em uma lista de argumentos. -r
é não chamar cat
se não houver entrada. Sem -0
(que como -r
não é padrão, mas é encontrado em muitas implementações, pelo menos aquelas em que xargs é útil para qualquer coisa), xargs
iria procurar por palavras em sua entrada para converter em argumentos, onde palavras são separados em branco e onde a barra invertida, aspas simples e duplas podem ser usadas para escapar desses separadores, então normalmente o formato locate
usa para exibir nomes de arquivos.
É por isso que usamos a opção -0
para locate
e xargs
, que usa o caractere NUL (que é o único caractere não permitido em um caminho de arquivo) para separar nomes de arquivos.
Observe também que locate
não é um comando padrão e existe um grande número de implementações diferentes com diferentes versões e diferentes opções e comportamentos. O código acima se aplica, pelo menos, a versões relativamente recentes das implementações locate
e mlocate
do GNU, que são as mais comuns nos sistemas operacionais baseados no Linux, pelo menos.