Я хочу найти все файлы и распечатать путь и имя файла для любого файла, в котором используется текст «Numlock» - будь то строчные, прописные или смешанные буквы.
Какую команду мне использовать?
Сценарий ниже поисков (текст) файлы в данном каталоге рекурсивно, для случаев данной строки, неважно, если это находится в верхнем или строчном, или какая-либо комбинация тех.
Это даст Вам список найденных соответствий, путей к файлам, объединенным с именем файла и фактическими случаями строки в файле, будучи похож:
/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)
Можно использовать 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' {} +