problema com grep

1

Fiquei me perguntando por que recebo a seguinte saída ao procurar arquivos com o comando:

$ grep -l prac *
allprac
grep: Desktop: Is a directory
grep: Documents: Is a directory
grep: Downloads: Is a directory
grep: Music: Is a directory
grep: Pictures: Is a directory

Eu estava me perguntando por que mostra tudo além do óbvio allprac ? Alguns dos diretórios listados estão vazios.

    
por user120161 11.12.2014 / 06:38

2 respostas

2

O * força grep a varrer dentro de todos os arquivos na pasta atual, em vez de usar a entrada padrão, mas como grep não está nas subpastas, apenas relata as ocurriências da pasta para stderr me desabilitar os relatórios basta redirecionar stderr para /dev/null (POSIX):

$ grep -l prac * 2>/dev/null

, a maneira adicional de evitar o relatório de pastas é (não POSIX):

$ grep -l Build --exclude-dir=* *

para digitalizar incluindo subpastas (POSIX):

$ grep -l prac * -r

para a entrada padrão do grep (POSIX):

$ cat file | grep -l prac

Há muitas implementações de grep , portanto, elas podem diferir entre si em um conjunto de chaves e comportamento padrão, mas existe um POSIX padrão que descreve um conjunto mínimo de chaves a serem implementadas por grep (e outras soft) . No entanto, eu não sei nada sobre o POSIX definir o comportamento de pesquisa padrão para grep . Parece que a implementação unix quase alcança grep -l Build --exclude-dir=* * do linux.

    
por Малъ Скрылевъ 11.12.2014 / 06:53
0

@ A resposta de Cremefraiche está certa porque é devido ao curinga. No entanto, sua solução parece não funcionar. Como o curinga '*' corresponde a todos os arquivos e pastas (exceto arquivos de ponto), bash acaba enviando os nomes de todos os arquivos e pastas no diretório atual como argumentos para grep . Como não é possível "ler em" um diretório (semelhante a como você não pode cat um diretório), você deve excluir os diretórios. A melhor maneira de fazer isso seria usar a ferramenta find .

grep -l prac $(find . -maxdepth 1 -type f)

Isso procuraria todos os arquivos regulares (-tipo f) no diretório. Se você quiser fazer uma busca recursiva da mesma maneira, apenas remova a opção -maxdepth. Note que isso não funcionará para arquivos com espaços em seus nomes ... ainda trabalhando em uma versão para isso.

    
por Chuck R 11.12.2014 / 07:05