Localiza palavra específica em todos os arquivos dentro e abaixo do diretório atual

6

Eu quero encontrar todos os arquivos e imprimir o caminho e o nome do arquivo, para qualquer arquivo em que o texto "Numlock" seja usado - seja de letras maiúsculas, minúsculas ou minúsculas.

Qual comando devo usar?

    
por ksor 04.05.2014 / 14:19

2 respostas

3

O script abaixo pesquisa arquivos (texto) em um determinado diretório recursivamente, para ocorrências de uma determinada string, não importando se ela está em maiúsculas ou minúsculas, ou qualquer combinação delas.

Ele fornecerá uma lista de correspondências encontradas, os caminhos para os arquivos, combinados com o arquivo e as ocorrências reais da string no arquivo, como:

/path/to/file1 ['numlock', 'numlocK']
/longer/path/to/file2 ['NuMlOck']

etc.

Para limitar o tempo de busca, procuraria correspondências em diretórios específicos, portanto, não para 2 TB de arquivos;).

Para usá-lo:

1] Copie o texto abaixo, cole-o em um arquivo de texto vazio (gedit). 2] Edite as duas linhas no cabeçalho para definir a string a ser pesquisada e o diretório a ser pesquisado. 3] Salve como searchfor.py. 4] Para executá-lo: abra um terminal, digite python3 + space , arraste o script para a janela de terminal e pressione Enter. A lista de correspondências encontradas aparecerá na janela do terminal

Em caso de erro, o script irá mencioná-lo.

#!/usr/bin/python3
import os
#-----------------------------------------------------
# give the searched word here in lowercase(!):
searchfor = "string_to_look_for"
# give the aimed directory here:
searchdir = "/path/to/search"
#-----------------------------------------------------
wordsize = len(searchfor)
unreadable = []
print("\nFound matches:")
for root, dirs, files in os.walk(searchdir, topdown=True):
    for name in files:
        file_subject = root+"/"+name
        try:
            with open(file_subject) as check_file:
                words = check_file.read()
                words_lower = words.lower()
                found_matches_list = [i for i in range(len(words_lower)) if words_lower.startswith(searchfor, i)]
                found_matches = [words[index:index+wordsize] for index in found_matches_list]
                if len(found_matches) != 0:
                    print(file_subject, found_matches)
                else:
                    pass
        except Exception:
            unreadable.append(file_subject)
if len(unreadable) != 0:
    print("\ncould not read the following files:")
    for item in unreadable:
        print("unreadable:", item)
    
por Jacob Vlijm 04.05.2014 / 17:12
12

Você pode usar grep -r para fazer uma pesquisa recursiva do conteúdo do arquivo, por exemplo

grep -Iri 'numlock' /path/to/search/dir/

em que /path/to/search/dir/ é o diretório de nível superior a partir do qual você deseja iniciar a pesquisa - você pode usar / , mas esteja preparado para que demore um longo tempo.

Algumas variações, dependendo da sua exigência exata:

  • altere a opção -r para -R se você quiser seguir links simbólicos
  • adicione a opção -l para imprimir apenas os nomes dos arquivos encontrados

O I diz ao grep para ignorar arquivos binários e o i torna a busca insensível ao caso.


Se sua versão do grep não suporta busca recursiva, você pode conseguir a mesma coisa usando uma combinação de find e grep, por exemplo.

find /path/to/search/dir/ -type f -exec grep --color -HIi 'numlock' {} +
    
por steeldriver 04.05.2014 / 17:59