How to accidentally get yourself with 'find ... -name something*
'
Suppose that you're in some subdirectory /a/b/c, and you want to search all of /a for the presence of files for any version of some program:
u@h:/a/b/c$ find /a -name program* -print
This reports '/a/b/c/program-1.2.tar' and '/a/b/f/program-1.2.tar', but you happen to know that there are other versions of the program under /a. What happened to a command that normally works fine?
As you may have already spotted, what happened is the shell's
wildcard expansion. Because you ran your find
in a directory that
contained exactly one match for 'program*', the shell expanded
it before you ran find
, and what you actually ran was:
find /a -name program-1.2.tar -print
This reported the two instances of program-1.2.tar in the /a tree, but not the program-1.4.1.tar that was also in the /a tree.
If you'd run your find
command in a directory without a shell
match for the -name wildcard, the shell would (normally) pass the
unexpanded wildcard through to find
, which would do what you want.
And if there had been only one instance of 'program-1.2.tar' in the
tree, in your current directory, it might have been more obvious
what went wrong; instead, the find returning more than one result
made it look like it was working normally apart from inexplicably
not finding and reporting 'program-1.4.1.tar'.
(If there were multiple matches for the wildcard in the current
directory, 'find
' would probably have complained and you'd have
realized what was going on.)
Some shells have options to cause failed wildcard expansions to be
considered an error; Bash has the 'failglob' shopt, for example.
People who turn these options on are probably not going to stumble
into this because they've already been conditioned to quote wildcards
for 'find -name
' and other similar tools. Possibly this Bash
option or its equivalent in other shells should be the default for
new Unix accounts, just so everyone gets used to quoting wildcards
that are supposed to be passed through to programs.
(Although I don't use a shell that makes failed wildcard expansions an error, I somehow long ago internalized the idea that I should quote all wildcards I want to pass to programs.)
Comments on this page:
|
|