Portál AbcLinuxu, 3. července 2025 17:49

[Bash01] _find_files_with

11.4.2006 22:06 | Přečteno: 1058× | implementácia

Do you speek Bash? (alebo "hovoríte bashom?") Ja áno a to už pár rokov. Počnúc týmto dielom sa o zopár svojich užitočných skriptov podelím aj s ostatnými Abíčkármi.

Nasledujúci skript rekurzívne vyhľadáva súbori, v ktorých sa nachádza hľadaný výraz. Nič výnimočné, ale programátori ocenia, že sa dokáže vyhýbať adresárom 'CVS' (viem, ani to nie je nič moc, ale... vie vypísať aj náhľady súborov).

Dlhý príbeh:

Skript je určený a vyhľadávanie "TODO" poznámok v zdrojových kódoch. Bez parametrov vyhľadá všetky súbori, ktoré obsahujú slovo "TODO".

$ _find_files_with

Viete, že Leoš Literák (zakladateľ a programátor Abíčka) píše "todo" malími písmenami? Viem to, lebo pracujem na zdrojákoch Abíčka (vo voľnom čase) a pre odlíšenie si TODO značím veľkými písmenami. Nakoľko ma Leošove TODO poznámky nezaujímajú, skript je citlivý na veľkosť hľadaného reťazca.

Ak chcete vyhľadávať "bezcitne" k veľkosti písmen, zadajte skriptu _druhý_ argument "-i ":

$ _find_files_with "" "-i"

Tým ale prepíšete ostatné parametre, ktoré skript predáva programu grep. Takže prídete o zafarbovanie hľadaného reťazca a okolité riadky. Ak tieto fičuri potrebujete používajte niečo takéto:

$ _find_files_with "" "-i -C 3 --colour=always"

Posledný _tretí_ argument slúži jedinému účelu - na zapínanie "CVSfóbie". Ak ako tretí argument zadáte "-cvs", skript sa vyhne všetkým súborom, v ktorých ceste sa nachádza adresár CVS. Mne sa to hodí často, CVS neznášam a používam Cogito (výnimočne Darcs):

$ _find_files_with "" "" "-cvs"

Krátky príbeh:

Synopsis

_find_files_with "term" "grep_opts" "-cvs"

Options

term
Musí byť _prvým_ parameterom. Určuje reťazec, ktorý bude v súboroch hľadaný. Predvolená hodnota: TODO
grep_opts
Musí byť _druhým_ parametrom. Dodatočné parametre pre program grep. Predvolená hodnota: -C 3 --colour=always
-cvs
Musí byť _tretím_ parametrom. Skript sa bude vyhýbať súborom v adresároch z názvom "CVS".

Kód:

#!/bin/bash

# File: _find_files_with
# Description: Finds files in which occurs given string

term="$1"
grep_opts="$2"
find_opts="! -type d"

if [ "$1" == "" ]; then
  term="TODO"
fi

if [ "$2" == "" ]; then
  grep_opts="-C 3 --colour=always"
fi

if [ "$3" == "-cvs" ]; then
  find_opts="$find_opts -path '*/CVS/*'"
fi

for i in `find $find_opts`; do
  if grepped=$(grep "$term" $i $grep_opts); then
    echo " >>>> file '$i' contains:"
    
    cat << EOT
$grepped
EOT
    
    echo " <<<<"
    echo
  fi
done
       

Hodnocení: 58 %

        špatnédobré        

Anketa

Ako píšete TODO?
 (94 %)
 (0 %)
 (6 %)
 (0 %)
Celkem 34 hlasů

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

11.4.2006 22:11 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: [Bash01] _find_files_with
Odpovědět | Sbalit | Link | Blokovat | Admin
Já píši TODO velkými. Důvod? Mám to zvýrazněné ve vimu a jsem zdechlý to nastavovat ještě pro cokoliv jiného. Takže moje upozornění jsou TODO, FIXME a XXX

Co přidat anketku? Jak píšete todo
When your hammer is C++, everything begins to look like a thumb.
Yin avatar 11.4.2006 22:24 Yin | skóre: 39 | blog: Yinotopia | Slovesnko, Košice
Rozbalit Rozbalit vše Re: [Bash01] _find_files_with
rado sa stalo
Nikdy nie je tak zle, aby to jeden poharik nemohol ešte zhorsiť.
11.4.2006 22:27 Pavel 'lingeek' Szalbot | skóre: 54 | Třinec
Rozbalit Rozbalit vše Re: [Bash01] _find_files_with
XXX? Porno si stahuju leda do /usr/local/bin...
Math, as Barbie says, is hard.
11.4.2006 22:39 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: [Bash01] _find_files_with
No já si to nevymyslel, prostě jsem si jednoho dne přečetl syntax file vimu pro C a našel jsem tam toto ;-)
syn keyword     cTodo           contained TODO FIXME XXX
When your hammer is C++, everything begins to look like a thumb.
12.4.2006 07:21 Pavel 'lingeek' Szalbot | skóre: 54 | Třinec
Rozbalit Rozbalit vše Re: [Bash01] _find_files_with
Já vím;). Ale zajímalo by mě, k čemu se to reálně používá (nezkoumal jsem).
Math, as Barbie says, is hard.
12.4.2006 07:59 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: [Bash01] _find_files_with
3 krat shift-X znacku napisem, 3 krat x znacku zmazem, jednoduchy dovod, nepostacuje ? :-D
Brabi avatar 11.4.2006 22:28 Brabi | skóre: 8 | blog: Fiend's records | Praha
Rozbalit Rozbalit vše Re: [Bash01] _find_files_with
Já píšu ToDo :)
Pets are always a great help in times of stress. And in times of starvation too, o'course.
12.4.2006 07:48 tomm | skóre: 7 | blog: tomm's software | Sokolov
Rozbalit Rozbalit vše Re: [Bash01] _find_files_with
Taky.
GUI existuje jen proto, aby se veslo vice terminalu na jednu obrazovku ...
11.4.2006 22:31 finn | skóre: 43 | blog: finnlandia | 49° 44´/13° 22´
Rozbalit Rozbalit vše Re: [Bash01] _find_files_with
Odpovědět | Sbalit | Link | Blokovat | Admin
Já na podobně věci používám grep, ale proti gustu... :)
Užívej dne – možná je tvůj poslední.
11.4.2006 23:39 Honza Král | skóre: 3 | Praha
Rozbalit Rozbalit vše Re: [Bash01] _find_files_with
Odpovědět | Sbalit | Link | Blokovat | Admin
tohle ti nebude fungovat na soubory obsahujici mezery a vubec je to docela nesikovne...

zkus misto toho

find yyy | xargs grep xxx

usetris docela dost casu i vykonu...

na zpracovani parametru bych doporucil getopts, nebo alespon normalni while ci for, aby si nemusel psat prazdne uvzovky kdyz chces vynechat jeden parametr...

vubec bych doporucil poohlednout se po netu po nejake ucebnici shellu ci nejakych ukazkovych skriptech...
12.4.2006 00:05 tired joe | skóre: 17 | blog: rootlet | Trenčín/Bratislava
Rozbalit Rozbalit vše Re: [Bash01] _find_files_with
..."hovoríte bashom?" Ja áno a to už pár rokov.

...vubec bych doporucil poohlednout se po netu po nejake ucebnici shellu ci nejakych ukazkovych skriptech...

To je ale také smutné .)

Človek sa riadi zdravým rozumom, až keď už nezostáva žiadne iné riešenie.
12.4.2006 07:13 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: [Bash01] _find_files_with
grep -r
find ... -print0 | xargs -0 ...
Yin avatar 12.4.2006 14:32 Yin | skóre: 39 | blog: Yinotopia | Slovesnko, Košice
Rozbalit Rozbalit vše Re: [Bash01] _find_files_with
formulka find|xargs nevypíše súbory vo formáte aký vyžadujem. Vlastne som týmto zápisom chcel trochu pozdvihnúť úroveň blogov... možno zajtra dostanem lepšie hodnotenie :(
Nikdy nie je tak zle, aby to jeden poharik nemohol ešte zhorsiť.
12.4.2006 22:24 Honza Král | skóre: 3 | Praha
Rozbalit Rozbalit vše Re: [Bash01] _find_files_with
zkusil si man xargs? xargs neni urcen na vypisovani, ale na spousteni prikazu...

demonstroval bych to na prikladu:

find . | xargs rm

ale bacha !!! ;)
Yin avatar 15.4.2006 00:53 Yin | skóre: 39 | blog: Yinotopia | Slovesnko, Košice
Rozbalit Rozbalit vše Re: [Bash01] _find_files_with
Viem, co robi xargs.
Nikdy nie je tak zle, aby to jeden poharik nemohol ešte zhorsiť.

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.