Найти определенное слово во всех файлах в и под текущей директорией

Я хочу найти все файлы и распечатать путь и имя файла для любого файла, в котором используется текст «Numlock» - будь то строчные, прописные или смешанные буквы.

Какую команду мне использовать?

7
задан 8 May 2014 в 02:57

2 ответа

Сценарий ниже поисков (текст) файлы в данном каталоге рекурсивно, для случаев данной строки, неважно, если это находится в верхнем или строчном, или какая-либо комбинация тех.

Это даст Вам список найденных соответствий, путей к файлам, объединенным с именем файла и фактическими случаями строки в файле, будучи похож:

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

и т.д.

Для ограничения времени поиска я искал бы соответствия в определенных каталогах, таким образом, не для 2 ТБ файлов;).

Для использования его:

1] Копия текст ниже, вставьте его в пустой текстовый файл (gedit). 2] Отредактируйте эти две строки в headsection для определения строки для поиска и каталог для поиска. 3] Сохраните его как searchfor.py. 4] выполнять его: откройте терминал, тип python3 + space, затем перетащите сценарий по возврату нажатия и terminalwindow. Список найденных соответствий появится в terminalwindow

В случае ошибки, сценарий упомянет его.

#!/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)
0
ответ дан 8 May 2014 в 02:57

Можно использовать grep -r, чтобы сделать рекурсивный поиск содержания файла, например,

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

, где /path/to/search/dir/ каталог верхнего уровня, с которого Вы хотите запустить поиск - Вы могли использовать /, но готовы к нему потребоваться много времени.

Некоторые изменения, в зависимости от Вашего строгого требования:

  • изменяются -r опция к -R, если Вы хотите перейти по символьным ссылкам
  • , добавляют -l, опция распечатать просто названия файлов нашла

Эти I, говорит, что grep для игнорирования двоичных файлов и эти i делает поиск нечувствительным к регистру.


, Если Ваша версия grep не поддерживает рекурсивный поиск, можно достигнуть того же самого с помощью комбинации находки и grep, например,

find /path/to/search/dir/ -type f -exec grep --color -HIi 'numlock' {} +
0
ответ дан 8 May 2014 в 02:57

Другие вопросы по тегам:

Похожие вопросы: