Cześć.
Mam ok 200 plików tekstowych max 4KB. Chciałbym znaleźć wśród nich te które zawierają w treści nazwę polskiego miasta.
W jaki sposób podeszlibyście do do rozwiązania takiego problemu? Wolałbym nie wysyłać tego do chmury
Alt+F7 w total commander i szukasz tekst w plikach
Ja bym użył notepad++ i szukanie w plikach
Skoro pliki 4kB to dla Ciebie duże pliki tekstowe, to Ty dużych plików tekstowych nie widziałeś :]
Jeśli chcesz napisać własny programik do tego, to ja bym wybrał Pythona.
Chat GPT dał taki kod:
import os
def find_string_in_files(folder_path, search_string):
"""
Szuka zadanego łańcucha znaków we wszystkich plikach tekstowych w danym folderze.
:param folder_path: Ścieżka do folderu, który ma być przeszukany.
:param search_string: Szukany łańcuch znaków.
"""
for root, dirs, files in os.walk(folder_path):
for file_name in files:
if file_name.lower().endswith(".txt"):
file_path = os.path.join(root, file_name)
try:
with open(file_path, "r", encoding="utf-8") as file:
content = file.read()
if search_string.lower() in content.lower():
print(f"Znaleziono w pliku {file_path}:")
print(content)
print("-" * 50)
except Exception as e:
print(f"Błąd odczytu pliku {file_path}: {e}")
# Przykład użycia:
folder_to_search = "/ścieżka/do/twojego/folderu"
search_term = "Python"
find_string_in_files(folder_to_search, search_term)
Pojedyncze szukanie, czy wielokrotne?
Jeśli pojedyncze, to ripgrep
→ ripgrep --fixed-strings $(nazwa miasta) /ścieżka/do/plików/
. Jako, że trochę bardziej skomplikowane wyszukanie ([A-Z]+_SUSPEND
) na dużo większej próbce (kod źródłowy Linuksa) zajmuje mu, zgodnie z README
, ułamek sekundy, to i tutaj się nie naczekasz zauważalną ilość czasu.
No chyba, że będziesz tego szukał w kółko. Wówczas bym zkonkatenował słowa ze wszystkich tych plików rozdzielając jakimś poza-alfabetycznym znakiem (np. |
), skonstruował z nich drzewo sufiksowe¹ i szukał w nim. Tak na moją przed-poranno-kawową głowę, szybciej od tego chyba się nie da, ale na wszelki wypadek i tak trzeba zastosować Pierwszą Zasadę Optymalizacji — „benchmark, benchmark, benchmark”.
¹ Szybka metoda konstrukcji drzewa sufiksowego — nie, żeby tutaj miało to większe znaczenie, plików jest w sumie mało i jest to jednorazowa robota…
Lista miast, (wikipedia): https://pl.wikipedia.org/wiki/Miasta_w_Polsce teraz odpowiednie zapytania do chata GPT, żeby to zescrapować i przeszukać twoją listę.
Tu wychodzi kto jakich narzędzi używa, można grepem, ja mam akurat neovim to robię ,fg
wpisuję jakąś część nazwy szukanej i mi znajduje wszystkie pliki gdzie to występuje, a jak zrobię ,ff
to mi znajduje wszystkie pliki grepując po takiej nazwie, czyli jak po części się znajduje taka nazwa w nazwie pliku.
Jak jednorazowo to bym wkleił dokument do chatgpt i poprosił o ogarnięcie tego.
Tu widzę same najnowsze technologie, sztuczna inteligencja, szmery bajery
A tak to robiliśmy w latach 90-tych:
curl -L https://pl.wikipedia.org/wiki/Dane_statystyczne_o_miastach_w_Polsce | xmllint --html --xpath '//td[1]/descendant-or-self::*/a/text()' - 1> lista_miast.txt 2> /dev/null
grep -F -n -f lista_miast.txt -r folder_z_plikami_do_przeszukania