[LUGOS] find -name -o -name - wtf?

Ales Casar casar at uni-mb.si
Fri Mar 29 01:13:22 CET 2002


On Thu, 28 Mar 2002, David Klasinc wrote:

> find ./ -name *.c -o -name *.h -o -name *.sql -exec wc -l \;
>
> ali komu to deluje pravilno?

Uff, uff! To si pa napisal lepo godljo, kakrsne clovek zlepa ne najde. Ta
ukaz bi po moje gladko lahko uvrstili na kaksno tekmovanje iz Unixa in od
tekmovalcev zahtevali pojasnitev, kdaj je ukaz pravilen/delujoc in kaj
takrat stori. No, mogoce je zdaj zaradi tega maila ze prepozno za to. :-/

Ukaz bo v praksi le zelo redkokdaj delal pravilno. Namrec takrat, ko bo v
trenutnem direktoriju (za katerega user mora imeti dovoljenje
branja in listanja) obstajala natanko ena datoteka (lahko je tudi
direktorij, link, socket, pipe,...) s koncnico .c, natanko ena datoteka s
koncnico .h in natanko ena datoteka s koncnico .sql, pri cemer je potrebno
izvzeti vse take datoteke prej omenjenih treh tipov, ki se zacnejo s piko.

Nenavadni dogodki se znajo pojaviti, ce katera od teh treh datotek vsebuje
presledke in nekako nimam prave volje zdaj razmisljati o vseh moznostih.
Sicer tega nisem sel sprobat, ampak kaj, ce bi ime kaksne datoteke bilo
recimo '* -exec rm -fr / ; -o -name a.sql'? Vsekakor taksnih find-ov v
stilu onega zgoraj ni najbolj zdravo izvajati, saj nikoli ne ves, kje je
morda kdo podtaknil kaksno datoteko s cudnim imenom. No, lahko sicer
najprej to pogledas, ampak... Za nas primer predpostavimo, da ni datotek s
presledki. :-)

In kaj bo ukaz naredil v tistih redkih primerih, ko bo sploh pravilen? Za
vsako datoteko, ki bo imela ime enako tisti natanko eni datoteki s
koncnico .sql bo na standardnem vhodu pricakoval, da uporabnik vtipka po
eno datoteko zakljuceno s Ctrl-D in potem presteje vrstice tako vtipkanim
datotekam.

David, upal bi se staviti, da to ni to, kar si ti pravzaprav zelel. :-)

> Oz, kako to napisat, da _bo_ delovalo pravilno??

Verjetno si hotel napisati kaj takega:

find . \( -name '*.c' -o -name '*.h' -o -name '*.sql' \) -exec wc -l {} \;

Se malo razlage. Zvezdic ne sme razresiti se shell, ampak morajo
nespremenjene priti do find-a. Zato apostrofi. V originalu med '-name
*.sql' in '-exec wc -l' ni bilo nicesar in je zato tam privzet operator
'-a' - logicni AND. Ker ima AND vecjo prioriteto od OR, se je ukaz wc
izvedel le za vsako najdeno datoteko s koncnico .sql, ne pa tudi za tiste
s koncnicami .c ali .h. Stvar resimo z oklepaji, ki jih spet ne sme
razresiti shell, ampak morajo nespremenjeni priti v find. Zato backslash-i
pred oklepaji. In ker verjetno ne zelimo vtipkovati datotek, katerim bi
radi presteli vrstice, je wc-ju kot argument pametno podati imena najdenih
datotek z '{}'.

Ales

-- 
Ales Casar                  | InterNet: Casar at uni-mb.si, A.Casar at ieee.org,
Faculty of EE & CS          |           A.Casar at s-gms.ms.edus.si
University of Maribor       | DECnet:   RCUM::ALES
SLOVENIA                    | WWW:      http://www.el.feri.uni-mb.si/~ales/




More information about the lugos-list mailing list