ako pracuje "find"?

ivop na regionet.cz ivop na regionet.cz
Čtvrtek Květen 24 17:00:02 CEST 2001


Jan Marek wrote:
> 
> Dobry den,
> 
> On Thu, May 24, 2001 at 03:34:15PM +0200, Michal Weinfurtner wrote:
> > mgr Jan Obdrzalek wrote:
> >
> > > > > [root in ~]# cd /
> > > > > [root in /]# find /usr -name grip*
> > > >
> > > > find /usr -name grip\*
> > > >
> > > > Musite zajistit, aby hvezdicku nespolknul shell (udela
> > > > expanzi podle obsahu aktualniho adresare).
> > >
> > > EHM... to by asi hledalo soubory, se jmenem dlouhym 5
> > > znaku, z nich posledni je hvezdicka a zadny takovy by
> > > nenaslo ....
> >
> > Mrknete do man bash a vyhledejte heslo "Pathname Expansion"  a bude vam to
> > jasne !
> 
> Mozna delam neco spatne, ale pokud si vlezu do root adresare a
> zadam si coby root prikaz:
> 
> find / -name qmai* -print
> 
> Tak mi to najde to stejne jako
> 
> find / -name qmai\* -print
> 
> find --version
> GNU find version 4.1.6
> (na mem Debian-u)
> 
> pricemz v korenovem adresari nemam o qmail-u zminku a v obou
> pripadech mi to vyhleda i soubory jmena qmail-inject apod.
> 
> Pokud ovsem zadam:
> 
> find / -name qmai -print
> 
> nenajde nic...
> 
> To jen takove experimentalni overeni... Doufam, ze to usmiri
> zastance escapovani i zastance setreni klavesy '\' ;-)))

Mno, duvod je jednoduchy: shell expanduje command line tak,
ze se qmai* snazi nahradit temi expanzemi = soubory, ktere tomu
odpovidaji. Pokud zadny takovy nenajde, ponecha tam ZNAKY qmai*
a ty se tak dostanou az k programu find. Pokud napisete 'qmai*'
nebo qmai\*, (tj. apostrofy nebo backslash), tak to shell
expandovat nebude urcite a da to findovi rovnou, ovsem sezere
ten backslash nebo ty apostrofy. Jinymi slovy, jste si jist, co to
udela, kdezto v prvnim pripade vysledek zalezi na obsahu
aktualniho adresare.

To je definovane (a popsane) chovani shellu (pocinaje sh)
uz velmi dlouho ( > 11 let zcela jiste, z te doby pochazeji
me poznamky na toto tema).

Proto taky pouzivam v shell-scriptech nasledujici obrat:

for i in *.txt
do
    [ -f $i ] || continue
    # tady je v $i opravdu existujici soubor
done

Zdravim,

Ivo Panacek

PS: Mozna bych jeste nasel sve zdrojaky k programu find,
    bylo to psano v Turbo Pascalu, tusim ze 4 nebo 5,
    a slapalo to v DOSu.
-- 
E-mail: Ivo.Panacek na regionet.cz
WWW:    http://ivop.regionet.cz
Mobile: +420 602 337776


Další informace o konferenci Linux