A maneira mais rápida de encontrar arquivos que contenham exclusivamente algum texto

3

Estou tentando descobrir a melhor e mais rápida maneira de encontrar arquivos cujo conteúdo é especificamente " algo "

Aqui está o motivo: Eu tenho um processo que eu tenho certeza que armazena seu PID em algum lugar em um arquivo, mas eu não sei onde (e eu quero descobrir). Eu tentei procurar por nomes de arquivos que podem ser usados para armazenar o dito pid ( /var/run/myproc.pid , e assim por diante), mas sem sucesso até agora. Gostaria de tentar pesquisar arquivos cujo conteúdo seja apenas nesse número. Eu gostaria de obter o PID de ps -aux ou top , ou alguma ferramenta como essa e, em seguida, procurar por arquivos cujo conteúdo é apenas esse número.

Eu ando pesquisando, mas todas as respostas parecem explicar como encontrar arquivos que contenham " algo " ... entre seu conteúdo. Eu quero algo um pouco diferente ... Eu quero uma correspondência exata do que " algo "

Obrigado antecipadamente.

    
por BorrajaX 26.07.2012 / 16:55

6 respostas

0

Algo como ...

ps ax|grep ntpd|cut -b1-5|xargs -I PID find /var/run/ -type f -exec grep '-l' '^PID$' {} ';'

Observe que o padrão grep especifica que a string de pesquisa deve ser a única coisa na linha, ou seja, é

start(^)
string (PID is replace by value sent to 'xargs')
end($)

PS: Eu testei isso fazendo ps ax > /var/run/psaxdump seguido do acima. Encontrou apenas ntpd.pid

    
por 26.07.2012 / 17:09
3

Coloque o texto desejado em um arquivo e, em seguida, execute cmp em cada arquivo candidato.

pgrep myproc >/tmp/the_pid
find /var -type f -size $(wc -c </tmp/the_pid)c -exec cmp -s /tmp/the_pid {} \; -print

Mas, para esse caso de uso, eu reinicio o programa em strace -eopen ou com uma % regra deauditd :

auditctl -F "ppid=$$,a2&0x100" -S open
/path/to/daemon
    
por 27.07.2012 / 02:29
1

Você pode passar uma Expressão Regular para o grep, tente isto: (assumindo que o PID é 67543)

grep -R '^67543$' /

Na expressão regular, o símbolo ^ cenot (sp) significa "início da sequência", e o símbolo $ sign significa "fim da sequência", portanto, a expressão regex somente retornará o resultado onde o arquivo é iniciado termina com a string "67543".

    
por 26.07.2012 / 17:03
1
find searchtree -type f -size 'stat -c%s needle'c | xargs -n1 diff -s needle
    
por 26.07.2012 / 17:05
1

Se o pcregrep estiver disponível em sua instalação, você poderá passar os sinalizadores -l (list filename), -r (recursivo) e -M (multiline) para executar o trabalho. Observe que \ A e \ Z representam o início e o fim das âncoras de string. No exemplo abaixo, 12477 é a string que está sendo pesquisada

pcregrep -l -r -M '\A12477\Z' dir
    
por 26.07.2012 / 17:46
1

Se o seu programa não for iniciado na inicialização ou junto com um zilhão de outros programas, seu pidfile deve ser tão antigo quanto o processo, que é menos de um minuto no começo.

Se você conhece o PID, você sabe o tamanho dele, então você pode reduzir o número de arquivos para pesquisar ainda mais:

 find -type f -mmin -1 -size 6c -exec grep 12345 {} \;

Para um PID de 5 dígitos, use 6c como tamanho, pois eles contêm uma nova linha à direita (de ysangkok como comentário).

    
por 26.07.2012 / 17:54