grep recursivo compatível com POSIX sem erros para diretórios inacessíveis

2

Qual script me permitiria digitar uma palavra-chave e imprimir o nome do arquivo contendo a palavra-chave dentro do conteúdo do arquivo, por exemplo, 'Carhart' dentro de todos os arquivos .sas em todos os subdiretórios? Eu tentei algo parecido com o seguinte, mas não funciona:

(find . -name '*.sas' -prune -type f -exec grep 'Carhart' > /dev/tty) >& /dev/null

O script satisfaria duas condições

  1. Ele é executado no tcsh no Solaris no SPARC-Enterprise, que é certificado POSIX
  2. Ele não gera linhas de 'Permissão negada' em diretórios que não tenho permissão para pesquisar e / ou ler. (localizar / -name '* .sas' -prune > / dev / tty) > & / dev / null

Como ( find / -name '*.sas' -prune > /dev/tty ) > & /dev/null funciona sem a permissão de relatório negada, como posso modificar essa linha simples para incorporar o grep?

    
por he wei 10.08.2015 / 02:15

1 resposta

3

Para fazer o grep imprimir apenas o nome do arquivo, passe a opção -l . Para procurar uma substring em vez de uma expressão regular, passe a opção -F .

Para pesquisar recursivamente por arquivos cujo nome corresponda a um determinado padrão, use find com as -type f e -name PATTERN primárias. Use -exec para invocar o grep.

find . -name '*.sas' -type f -exec grep -F -l 'Carhart' {} +

Se você quiser evitar erros de diretórios que você não pode percorrer, use -perm , -user e -group para analisar as permissões (o que é difícil de acertar e não trabalhe se você tiver o ACL), ou chame test (que é retardado porque é um programa externo, mas é mais confiável).

find . -type d ! -exec test -r {} -a -x {} \; -prune -o \
       -name '*.sas' -type f -exec test -r {} \; -exec grep -F -l 'Carhart' {} +
    
por 10.08.2015 / 02:25

Tags