Este é um comando compatível com POSIX que inicia grep
para muitos arquivos de uma só vez:
find . -type f -name '*.sas' -exec grep -li liasse {} +
Seu comando grep -rli liasse *.sas ./
não funciona como esperado. Vamos analisar o que acontece:
-
*.sas
sofre globulação de concha.- Se houver pelo menos um objeto no diretório atual que corresponda a
*.sas
, todos eles serão colocados apósliasse
. - Se não houver esse objeto,
grep
pode obter literal*.sas
como um caminho a ser inspecionado (depende; investigue, por exemplo,shopt -s nullglob
,shopt -s failglob
embash
) e ative o aviso.
- Se houver pelo menos um objeto no diretório atual que corresponda a
- De qualquer forma,
grep
obtém./
e processa-a recursivamente em uma pesquisa porliasse
nos arquivos. Isso processa todos os arquivos em./
: programs, tables, whatever.
É por isso que você pode obter um nome de tabela no seu resultado.
Meu comando find . -type f -name '*.sas' -exec grep -li liasse {} +
runs grep
apenas para arquivos que correspondem a *.sas
pattern. Coisas importantes:
-
-type f
escolhe somente arquivos. Dessa forma eu evito que nomes de diretórios correspondendo*.sas
(se houver) sejam passados paragrep
(grep
sem-r
deve rejeitá-los de qualquer maneira, mas seria menos elegante). - Citando o padrão impede o shell de globbing;
find
obtém literal*.sas
como um argumento para o operando-name
; sabe interpretar padrões como este. -
A sintaxe
find … -exec … {} +
substitui vários objetos no lugar de{}
. Desta forma, menos (talvez apenas um)grep
processos são criados, em comparação comfind … -exec … {} \;
.