Joe Smith wrote: > > Pierre Fortin wrote: > ... > > I would think this indicates that "find" is buggy since the "-o|-or|," does not > > seem to work as documented... comments...? > ... > > find(1) is a first-class bitch of a program. It consistently trips me > up with it's arcane syntax and unexpected behavior. AMEN! on the trip-ups; but I still think find is buggy... more below... > In this case, you are being bitten by the fact that find follows the > file globbing behavior of the shell (from 'info find'): > In the `find' tests that do shell pattern matching (`-name', > `-path', etc.), wildcards in the pattern do not match a `.' at the > beginning of a file name. IOW, "find ." sees *all* the files, then the matching part sucks. > Your problem with '-or' is that there is an implied '-and' before > '-print', so that you are really doing 'a or b and c', which is > different than 'b or a and c' because 'and' has higher precedence. If > you use parens (or drop the '-print'), it works as you expect: >From man: -print True; print the full file name on the standard output, followed by a newline. ^^^^ so: 'a or b and 1' is the same as 'a or b' since the result of 'b and 1' will always be 'b' Ditto for 'b or a and 1' Hence, '-print' should not be a factor in the output; yet *each* of the following commands: $ find .test -print -iname test\* -iname .test\* # (implied -and) ^^^^^^ $ find .test -iname test\* -or -iname .test\* ^^^ give: .test .test/test1 .test/test1/test2 .test/test1/test2/TEST2 .test/test1/TEST1 .test/.test1 .test/.test1/.test2 .test/.test1/.test2/.TEST2 .test/.test1/.TEST1 Where's the logic in that..? :^) Yet: $ find .test -iname test\* -iname .test\* $ find .test -iname test\* -or -iname .test\* -or -print give no output! Implies that '-print', while "True", impacts the results of the tests by causing alteration of the remaining parm relationships... I think this is more than arcane, it's plain buggy, IMHO... Interesting, no...? :^) Pierre > $ find . \( -iname '.test*' -o -iname 'test*' \) -print > ./.test > ./.test/test1 > ./.test/test1/test2 > ./.test/test1/test2/TEST2 > ./.test/test1/TEST1 > ./.test/.test1 > ./.test/.test1/.test2 > ./.test/.test1/.test2/.TEST2 > ./.test/.test1/.TEST1 > > As far as the original problem, I would suggest keeping the find part as > simple as possible and use grep to do the matching: > > $ find . -type f | grep test > > Or, more precisely: > > $ find . -type f | grep 'read[^/]*$' > > to limit the match to the filename component. > > <Joe
Want to buy your Pack or Services from MandrakeSoft? Go to http://www.mandrakestore.com