Como usar o comando “cat” na saída do comando “find”?

Como usar o comando “cat” na saída do comando “find”?

Quero redirecionar a saída do findcomando para catcomando para poder imprimir os dados do arquivo fornecido.

Então, por exemplo, se a saída de find for, /aFile/readmeentão o gato deve ser interpretado como cat ./aFile/readme. Como posso fazer isso instantaneamente?

Devo usar canos?

Eu tentei versões disso:

cat | find ./inhere -size 1033c 2> /dev/null

Mas acho que isso está completamente errado? É claro que tenho certeza de que a saída é apenas um arquivo e não vários arquivos.

Então, como posso fazer isso? Procurei no Google e não encontrei solução, provavelmente porque não pesquisei direito :P

Responder1

Você pode fazer isso findsozinho usando a -execação:

find /location -size 1033c -exec cat {} +

{}será substituído pelos arquivos encontrados por finde +nos permitirá ler tantos argumentos quanto possível por invocação de cat, pois catpode receber vários argumentos.

Se você findnão possui a +extensão padrão ou deseja ler os arquivos um por um:

find /location -size 1033c -exec cat {} \;

Se você quiser usar alguma opção de cat, faça:

find /location -size 1033c -exec cat -n {} +
find /location -size 1033c -exec cat -n {} \;

Aqui estou usando a -nopção de obter os números das linhas.

Responder2

Substituição de comando

Outra opção é usarSubstituição de comando. Agrupar um comando $()executará o comando e substituirá o comando por sua saída.

cat $(find ./inhere -size 1033c 2> /dev/null)

se tornará

cat ./inhere/file1 ./inhere/file2 ./inhere/file3

Isso é mais ou menos equivalente a usar o estilo antigo de agrupar comandos com crases:

cat `find ./inhere -size 1033c 2> /dev/null`

Mais detalhes nos documentos vinculados acima

Bash executa a expansão executando o comando em um ambiente subshell e substituindo a substituição do comando pela saída padrão do comando, com todas as novas linhas finais excluídas. As novas linhas incorporadas não são excluídas, mas podem ser removidas durante a divisão de palavras. A substituição do comando $(cat file)pode ser substituída pelo equivalente, porém mais rápido $(< file).

Quando a forma de substituição com aspas crases no estilo antigo é usada, a barra invertida mantém seu significado literal, exceto quando seguida por $, `ou \. A primeira crase não precedida por uma barra invertida encerra a substituição do comando. Ao utilizar o $(command)formulário, todos os caracteres entre parênteses compõem o comando; nenhum é tratado especialmente.

As substituições de comandos podem ser aninhadas. Para aninhar ao usar o formato entre aspas, escape das aspas internas com barras invertidas.

Se a substituição aparecer entre aspas duplas, a divisão de palavras e a expansão do nome do arquivo não serão executadas nos resultados.

Veresta outra respostapara alguns bons exemplos de uso.

Responder3

Isso imprimirá o nome e o conteúdo dos arquivos de texto (ascii) apenas de forma recursiva.

find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'

Mais uma tentativa

find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;

Responder4

Use pipe e xargs

find /* -name pg_hba.conf | xargs cat

Se falhar devido à falta de permissões, você pode usar sudo para garantir que tem permissão para executar o comando find no diretório que está pesquisando.

 sudo find /* -name pg_hba.conf | xargs sudo cat

informação relacionada