Vyhľadávanie. Ako jednoduché to môže byť.

08.05.2023 | 15:59 | Richard | Richard

Keď som pred cca 20-timi rokmi založil firmu a začal podnikať, veľmi rýchlo som pochopil, že polovica pracovného času podnikateľa je vyplnená - hľadaním. Nejakého dokumentu, potvrdenia, dokladu.

A tak je to aj dnes

Dnes to nie je omnoho lepšie, ba andimistratívna záťaž sa určite zvýšila, ale všetko, čo existuje v papierovej podobe, máme i v digitálnej. Skenujem aj rukou robené poznámy a nákresy a tiež faktúry, ktoré niektorí stále posielajú poštou.

Mám nejaký systém triedenia, ktorý kupodivu aj funguje. A v tomto systéme je však potrebné informácie, súbory, vyhľadávať. Niečo je v "kastlíkoch" Zettelkasten (https://linuxos.sk/blog/richard/detail/druhy-mozog-so-zettelkasten/), ale väčšina vecí nie je nejako "dátabazovo" utriedených.

 

Bežné prostriedky

Kto má rád GUI, tak si pomôže s vyhľadávacími nástrojmi, napríklad zabudovanými do súborových manažérov, napr. v Double Commander-i. Alebo dedikované nástroje ako SearchMonkey.

V emulátore terminálu je zaužívaný supermocný nástroj find. Ak človek obsiahne jeho syntax, poradí si všade.
Len na osvieženie pamäte si môžeme ukázať jeden príklad:

find . -type f -iname *alegria*

kde . definuje aktuálny adresár, type f hľadá len v súboroch a iname hľadá podľa názvu, a to s ignorovaním veľkých/malých písmen.

Obr. 0: starý dobrý find v akcii

 

find má samozrejme veľa iných a silných parametrov.

Ale tento zápis nebude o find-e, načo aj, keď tutoriálov o ňom je habadej.

 

fd

Dlhé roky som používal find, až som raz natrafil na fd (https://github.com/sharkdp/fd). A je k dispozícií aj v bežných repozitároch, niekde pod názvom fdfind. Nie je to žiadna novinka, ale nejako ušla mojej pozornosti.

V skratke sa jedná o vyhľadávač, ktorého syntax je jednoduchšia a príjemnejšia na používanie. Z hlavných výhod, ako ich uvádza autor na githube, možno uviesť:


Takže analogický príkaz ako vyššie uvedený by vyzeral:fd -t f alegria

Obr. 1: fd v akcii
A to je už zásadné skrátenie. A fd má všetky pokročilé funkcie ako samotný find, ako regulárne výrazy, hľadanie presnej cesty, vykonávanie príkazov (napr fd -j 1 alegria -x mpv, parameter -j 1 spôsobí, že sa vyhľadané súbory spustia pomocou mpv nie naraz (paralelne), ale sériovo), vynechávanie súborov/adresárov,…

 

Takže fd je veľmi návykový a ľahko sa mu podľahne.

 

Triky s Emacsom

Find, /fd/… to všetko je v prostredí emulátora terminálu super. Ale kto je rozmaznaný interaktivitou Emacsu, bude "krútiť nosom". Akoby aj nie, keď shellové prostredie Emacsu dokáže takéto zázraky:

find-dired

find-dired je akýmsi základom. Jedná sa o nadstavbu find-u, pričom je užívateľ vyzvaný k zadávaniu parametrov. Takže parametre find-u je potrebné poznať. Ale odmenou je vytvorenie bufferu s nájdenými výskytmi, ktoré je plne interaktívne, tak, ako v bežnom správcovi súborov a teda je možné na vyhľadné súbory či adresáre aplikovať kdejaké príkazy, úkony.

Obr. 2…4: find-dired - Emacsová efektívnosť

Upresnením find-dired je príkaz find-name-dired, kde sa automaticky použije parameter name príkazu find.

 

sr-find-file + sr-find-name + sr-find

Užívatelia farebných televízorov Emacsu a jeho nadstavby Sunrise Commander (https://linuxos.sk/blog/richard/detail/sunrise-commander-aka-dired-ortodoxne/) môžu využiť ďalšie rozšírenia, ktoré akoby z oka vypadly skôr uvedeným príkazom. Ale ich výhodou je, že výsledky sa otvoria v tzv. virtuálnom bufferi, ktorý sa tvári ako jeden adresár s výskytmi (opäť, analógia s find-dired), ale tento buffer je jedným z panelov Sunrise Commander-a.
Takto napísané to znie zmätočne, ale obrázok napovie:

Obr. 5: sr-find-file - výsledky hľadania do panelu komandéra
Nad vylistovanými súbormi vidíme, aké parametre za nás tento príkaz (funkcia) doplnil. No kto by si to pamätal.

 

Tri uvedené príkazy sa líšia v parametroch, ktoré sú predávané do find-u. Takže nie je to žiadna kozmická veda, vždy na pozadí "maká" find, ale to, že výsledky sú poruke a sú interaktívne, to je neoceniteľná výhoda.

 

locate

Príkaz locate vyhľadáva v databáze súborov, tá sa vytvára pomocou príkazu updatedb manuálne, alebo to robí nejaký automatizovaný plánovač. Jeho výhodou je, že toto vyhľadávanie je nepomerne rýchlejšie, ale zase hľadá len podľa názvu súboru a vracia jeho umiestnenie.
Tu ani nie je veľmi o čom písať. Preto len uvediem, že ak je príkaz volaný z emacsu (locate), tak výsledky sú opäť interaktívne vylistované v špeci bufferi; jeho analógiou je sr-locate, kde platí to isté čo pri príkaze find. A nakoniec napríklad nadstavba helm má parádičku helm-locate, ktorá umožňuje "fuzzy" hľadanie v spomínanej databáze.

Obr. 6: Príkaz locate v shelle Emacsu

 

A čo to ovocie?

Teda konkrétne grep. To je tiež silný a dennodenne používaný nástroj, ktorý vyhľadáva priamo v obsahoch súborov. Len na pripomenutie, základné použitie je nejaké takéto:
grep -i -r <text> <súbor(y)>
Teda bez rozlišovania písmen hľadá výskyt textového reťazca v súbore, a to aj rekurzívne v podadresároch.
Opäť nič nové, ani vzrušujúce, ale veci sa zlepšia s týmito rozšíreniami Emacsu:

grep

Hm, spustenie funkcie s týmto názvom zobrazí dialóg, v ktorom stačí doplniť vyhľadaávaný reťazec, prípadne -r pre rekurzívne hľadanie. Opäť obrázky:
 

Obr. 7, 8: Príkaz grep v Emacse
Výsledky sú nielen farebné, ale fungujú aj ako hyperlinky, ktoré nás presunú do konkrétneho súboru na konkrétny riadok. Vidno, že v porovnaní s klasickým terminálovým grep-om je to iný citrus!


Okrem toho existujú ešte tieto varianty:


Pre Sunrise Commander existuje funkcia sr-find-grep, ktorá to integruje do neaktíveho panelu súborového manažéra.

 

Vyhľadávanie v projekte

V rámci jedného súboru Emacs exceluje v dynamickom hľadaní textových reťazcov. Na prevažne slúži occur, resp. jeho vylepšená verzia helm-occur. Vyzerá to nejako takto:

Obr. 7, 8: Príkaz helm-occur dynamicky zobrazuje nájdené výskyty, pričom zvolený riadok ukazuje v náhľade


Ak chceme hľadať vo všetkých otvorených bufferoch, vtedy siahneme po multi-occur resp. multi-occur-in-matching-buffers.


Ešte spomeniem, že v okne s výskytmi je možné tieto priamo editovať!

 

V rámci hľadania v adresári projektu existuje (napr.) rozšírenie noccur (https://github.com/NicolasPetton/noccur.el/tree/fa91647a305e89561d3dbe53da002fff49abe0bb). Toto robí podobnú prácu, ale vyhľadáva i v ostatných súborov v rámci adresára alebo projektu.

Obr. 7, 8: Príkaz noccur hľadá v projekte: na obrázku vidno výskyt vo viacerých súboroch
 

 

Záver

Tých utilít na vyhľadávanie je nepomerne viac, ale ja si vystačím len s tu uvedenými.
Napr. existujú nástroje pre Emacs, ktoré uľahčujú hľadanie v git-e, sofistikovanejšie "fuzzy" hľadanie v projektoch, rozšírenia pre ripgrep,…

Ale aj v tomto príspevku je ukázané, že ak si človek raz zvykne na nejaký "ekosystém" (čo je nepekné a sprofanované slovo), ťažko sa prispôsobí inému.

To je požehnaním i prekliatím súčasne.

    • RE: Vyhľadávanie. Ako jednoduché to môže byť. 09.05.2023 | 06:55
      Avatar kamowski Linux Mint  Používateľ

      takýchto návodov nie je nikdy dosť, ďakujem za príspevok :)

      situácia 1:

      • som v poslednom vnorenom adresári
      • pomocou "fd" dám vyhľadať dokument
      • dostanem niekoľko možností (01.txt, 02.txt, ... 54.txt) medzi nimi aj ten, ktorý hľadám (45.txt)

      otázka 1:
      teraz čo? ako ho otvorím k editácii?
      ---
      robím to tak, že zadám:
      XED 45 (tu, ak treba, dám TABULÁTOR, nech mi doplní názov) a ENTER
      #miesto XED tam môže byť hociktorý editor alebo najlepšie XDG-OPEN, tu si môžete vytvoriť alias open=xdg-open :)

      otázka 1.1:
      je aj nejaký efektívnejší spôsob?

      >>>>>>>>>>>>>>>>>>>>>>>>>>

      situácia 2:

      • som v nadradenom adresári, s množstvom vnorených adresárov
      • pomocou "fd" dám vyhľadať dokument
      • dostanem oveľa viac možností (01.txt, 02.txt, ... 125543.txt) medzi nimi aj ten, ktorý hľadám (45.txt) ale aj s cestou aa/bb/cc/dd/ee/45.txt

      otázka 2:
      teraz čo? ako ho otvorím k editácii?
      ---
      robím to tak, že skopírujem celú tú cestu a zadám:
      XED - vložím celú tú CESTU (pridám úvodzovky, ak treba) - ENTER

      otázka 2.1:
      je aj nejaký efektívnejší spôsob?

      >>>>>>>>>>>>>>>>>>>>>>>>>>

      možno je to úplne banálna vec, možno to patrí medzi základy práce s terminálom, možno ....
      ale ja nemám na to školy, učím sa "za jazdy", a teraz som došiel sem, tak sa pýtam :)

      • RE: Vyhľadávanie. Ako jednoduché to môže byť. 09.05.2023 | 14:53
        Avatar Richard Antix  Používateľ

        Ad 1.1:

        Ak človek nie je v príjemnom a nerušenom a relaxačnom (má i vstavaného psychológa) :) prostredí Emacsu, potom sa zdá ako najlepšia forma toto:

        1. Nainštalovať si FZF (program na fuzzy hľadanie, listovanie a nejakú interaktivitu)

        (býva v repozitároch, napr. sudo apt install fzf)

        2. Nainštalovať si fd (ale ako som zistil, niekde sa to volá fd-find alebo i fdfind, veď prečo nie :) )

        (napr. sudo apt install fd-find)

        3. Potom som skúšal: nano $(fdfind hladany_retazec | fzf)

        (v tvojom prípade teda asi xed $(fdfind hladany_retazec | fzf)

    • RE: Vyhľadávanie. Ako jednoduché to môže byť. 09.05.2023 | 20:31
      Avatar kamowski Linux Mint  Používateľ

      vďaka za odpoveď
      fd mám nainštalovaný, pridal som si aj fzf

      ci pána, do pána, prepisujem to už tretí krát, správne naformulovať otázku alebo odpoveď, to dá zabrať :)

      tvoja odpoveď je v poriadku, robí presne to, čo má, vyhľadá zadaný reťazec a otvorí ho v xed ale ...

      hľadaný reťazec, teda vlastne názov dokumentu, nesmie obsahovať medzery !!!

      ak mám napr.:
      to je hľadaný dokument.txt
      tak v xed sa mi otvárajú 4 záložky samozrejme s prázdnymi stránkami

      dá sa ten príkaz ošetriť týmto smerom?

      • RE: Vyhľadávanie. Ako jednoduché to môže byť. 10.05.2023 | 08:47
        Avatar Richard Antix  Používateľ

        Treba poslať výstup z fzf do xed-u uzavretý v úvodzovkách:

        xed $echo "\"$(fdfind hľadaný_text | fzf)\""

         

        A teda je rozumné spraviť si nato aj alias:

        alias fdxed='xed $echo "\"$(fdfind $1 | fzf)\""'

         

        Takže vyhľadávanie bude v tvare:

        fdxed <hľadaný súbor>

         

        • RE: Vyhľadávanie. Ako jednoduché to môže byť. 10.05.2023 | 12:11
          Avatar Richard Antix  Používateľ

          Hm, takto to asi nefunguje dobre - lebo to aj vytvorí súbor s " v názve. Zrejme by tochcelo nejaký pidi skript, kde zoberie vstup z FZF a pospája reťazce a toto predá pre textový editor.

          Porozmýšľam.

          • RE: Vyhľadávanie. Ako jednoduché to môže byť. 10.05.2023 | 13:54
            Avatar Richard Antix  Používateľ

            Takže oprava:

            Nakoniec stačí, ak je to takto:

            xed "$(fdfind hľadaný_súbor | fzf)"

    • RE: Vyhľadávanie. Ako jednoduché to môže byť. 10.05.2023 | 17:52
      Avatar kamowski Linux Mint  Používateľ

      áno, toto je funkčné :)
      a nakoľko mi to vyhľadá súbory v rôznych formátoch, prepísal som si ten začiatok:

      xdg-open "$(fd hľadaný_súbor | fzf)"

      možeš to prosí ešte zapísať ako alias?
      trápim sa s tými úvodzovkami a nijak mi to nefunguje :(

      • RE: Vyhľadávanie. Ako jednoduché to môže byť. 13.05.2023 | 08:44
        Avatar Richard Antix  Používateľ

        Hm, ten alias nejde ani mne, logicky by to malo byť:

        xdg-open "$(fd $1 | fzf)"

        Čo ale prakticky spôsobí, že do xdg-open nie je posunutý výstup z fd (teda názov súboru), ale práve $1, čo je ten hľadaný reťazac.

        Musím to zvážiť, resp. možno niekto prispeje svojim nápadom.