# Zaawansowane wyszukiwanie z użyciem find i grep

**1. `find` – wyszukiwanie plików i katalogów**

```
find /ścieżka -iname "wzorzec"
```

Szukamy plików lub katalogów według nazwy ze **zignorowaniem wielkości liter** (opcja `-iname`).   
Przykład: `find /var/log -iname "*.LOG"` znajdzie wszystkie pliki z rozszerzeniem .log lub .LOG.

```
find . -type f
```

Szukamy wyłącznie zwykłych plików w bieżącym katalogu i jego podkatalogach. (`-type f` = file)

```
find . -type d
```

Szukamy tylko katalogów. (`-type d` = directory)

```
find /home -mtime -7
```

Wyszukujemy pliki zmodyfikowane w ciągu ostatnich 7 dni. (`-mtime` to czas modyfikacji, `-7` oznacza mniej niż 7 dni temu)

```
find /var/www -size +10M
```

Wyszukujemy pliki większe niż 10 megabajtów. (`+10M` oznacza większe niż 10MB)

**Co oznaczają opcje:**

- `-iname` – wyszukiwanie nazwy pliku bez zwracania uwagi na wielkość liter.
- `-name` – wyszukiwanie nazwy pliku uwzględnia wielkość liter.
- `-type f/d/l` – filtr według typu: *f* = plik zwykły, *d* = katalog, *l* = link symboliczny.
- `-mtime N` – pliki modyfikowane dokładnie N dni temu; `-mtime -N` – zmodyfikowane w ciągu ostatnich N dni.
- `-size +N` – pliki większe niż N jednostek (k, M, G).

---

**2. `grep` – wyszukiwanie tekstu wewnątrz plików lub strumieni danych**

```
grep "wzorzec" plik.txt
```

Wyszukuje linie zawierające `wzorzec` w podanym pliku.

```
grep -i "blad" plik.txt
```

Ignoruje wielkość liter, znajdzie "blad", "Blad", "BLAD" itd.

```
grep -r "error" /var/log
```

Rekurencyjnie wyszukuje słowo "error" we wszystkich plikach w katalogu /var/log.

```
grep -n "start" plik.txt
```

Wyświetla numer linii, w której znaleziono dopasowanie.

```
grep -c "fail" plik.txt
```

Liczy liczbę linii, które zawierają "fail".

```
grep -v "warning" plik.txt
```

Wyświetla linie, które *nie* zawierają słowa "warning".

```
grep -l "TODO" *.c
```

Wyświetla tylko nazwy plików z rozszerzeniem .c, w których znaleziono słowo "TODO".

**Opisy opcji:**

- `-i` – ignoruj wielkość liter;
- `-r` – rekurencyjne przeszukiwanie katalogów;
- `-n` – pokazywanie numerów linii;
- `-c` – liczenie wystąpień;
- `-v` – negacja wzorca (linia nie zawiera wzorca);
- `-l` – pokazuje tylko nazwy plików z dopasowaniem.

---

**3. Łączenie `find` z `grep` – wyszukiwanie wzorców tekstowych w określonych plikach**

```
find /var/www -type f -name "*.php" -exec grep -l "mysqli_connect" {} \;
```

Znajduje wszystkie pliki .php w katalogu /var/www, które zawierają tekst "mysqli\_connect".

```
find /var/www -type f -iname "*.conf" -exec grep -iH "server" {} \;
```

Znajduje pliki konfiguracyjne (bez zwracania uwagi na wielkość liter w nazwie) zawierające słowo "server" (ignorując wielkość liter, pokazując nazwy plików i linie).

```
find . -iname "test*" -print0 | xargs -0 grep -l "error"
```

Wyszukuje pliki zaczynające się na "test" i sprawdza, czy zawierają słowo "error". Bezpieczne dla nazw z odstępami dzięki `-print0` i `xargs -0`.

---

**Praktyczne wskazówki**

- Używaj `-iname` w find, jeśli nie jesteś pewien wielkości liter w nazwach plików.
- Łącz `find` z `grep` przy pomocy `-exec` lub `xargs`, aby wyszukiwać w treści plików wybrane wzorce.
- Opcje `grep` `-r` i `--include` pozwalają filtrować rekurencyjne wyszukiwania wg typu plików.
- Przetestuj zapytania na mniejszych katalogach dla sprawdzenia wyników przed uruchomieniem na dużych strukturach.

---

**Podsumowanie**

`find` i `grep` to podstawowe, lecz bardzo potężne narzędzia do wyszukiwania plików i danych w nich zawartych, ich właściwe stosowanie znacząco ułatwia administrowanie systemami i skryptowanie operacji.