Como exibir apenas nomes de arquivos com grep no Linux

0
30


grep é um utilitário Linux para procurar arquivos de texto. Por padrão, ele imprimirá os resultados da pesquisa, mas também pode ser usado para corresponder e imprimir os nomes dos arquivos que contêm o resultado da pesquisa, o que pode ser útil ao conectar-se a outros scripts.

Usando grep para imprimir nomes de arquivos

grep é comumente usado em conjunto com outros comandos em scripts bash como um utilitário geral de pesquisa de texto. No entanto, por padrão, ele não imprime nada acima dos nomes dos arquivos, que você pode precisar se estiver passando a saída para outro utilitário.

Se você quiser uma lista de arquivos correspondentes, você pode usar grep com ele -l bandeira, que listará os nomes dos arquivos em vez de corresponder:

grep -l foo ./*

Isso é semelhante a -H flag, que irá gerar uma resposta contendo o nome do arquivo seguido pela linha correspondente. No entanto, com -lvai a imprime o nome do arquivo, fornecendo uma lista de arquivos que contêm a string de pesquisa.

Você também pode usar um letra maiúscula -L bandeira para fazer o contrário: imprima todos os arquivos que não contenham a string correspondente.

grep -L baz ./*

Caminho do arquivo de corte

Por padrão, o -l sinalizador imprimirá arquivos com um caminho de arquivo relativo anexado. Se você deseja apenas o nome real do arquivo, pode cortar o caminho do arquivo usando o basename Utilitário. Isso exigirá que a entrada seja passada xargsmas funciona muito bem:

grep -l foo ./* | xargs -L 1 basename

Tenha isso em mente grep -r irá pesquisar recursivamente, e se você usá-lo com basenamea resposta pode conter arquivos com caminhos recortados que não estão diretamente no atual.

Usando grep com o comando find

grep também funciona bem com o utilitário de pesquisa adicional do find domínio. Por exemplo, você pode usá-lo com o find Comando para encontrar todos os arquivos de texto em um diretório e executar facilmente um grep procurar:

find . -iname "*txt" -exec grep foo {} ;

Ou use com -l sinalizador para listar nomes de arquivos:

find . -iname "*txt" -exec grep -lH foo {} ;