
Quero redirecionar a saída do find
comando para cat
comando para poder imprimir os dados do arquivo fornecido.
Então, por exemplo, se a saída de find for, /aFile/readme
entã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 find
sozinho usando a -exec
ação:
find /location -size 1033c -exec cat {} +
{}
será substituído pelos arquivos encontrados por find
e +
nos permitirá ler tantos argumentos quanto possível por invocação de cat
, pois cat
pode receber vários argumentos.
Se você find
nã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 -n
opçã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