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.