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:
-
*.sassofre 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,
greppode obter literal*.sascomo um caminho a ser inspecionado (depende; investigue, por exemplo,shopt -s nullglob,shopt -s failglobembash) e ative o aviso.
- Se houver pelo menos um objeto no diretório atual que corresponda a
- De qualquer forma,
grepobtém./e processa-a recursivamente em uma pesquisa porliassenos 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 fescolhe somente arquivos. Dessa forma eu evito que nomes de diretórios correspondendo*.sas(se houver) sejam passados paragrep(grepsem-rdeve rejeitá-los de qualquer maneira, mas seria menos elegante). - Citando o padrão impede o shell de globbing;
findobtém literal*.sascomo 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)grepprocessos são criados, em comparação comfind … -exec … {} \;.