Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Often I have a file name and it's partial path, e.g. "content/docs/file.xml".

Is there a simple way to search for that file, without manually cutting into parts its name to provide directory name and file name separately?

It'd be great if find worked in that way, so I could run find content/docs/file.xml, but unfortunately it doesn't.

share|improve this question
1  
You could try adding a * wildcard at the beginning. find -path *content/docs/file.xml worked for me. –  Bob Mar 13 '12 at 8:58
    
thanks, @Bob, it's really worked for me. Btw, interesting, that if I'm adding a slash after an asterisk: "find -path */content/docs/file.xml", it doesn't work. Thanks a lot anyway. –  user69817 Mar 13 '12 at 9:06
    
also, @Bob, please make it as an answer and I'll mark it as a correct. –  user69817 Mar 13 '12 at 9:08
    
The reason the slash after asterisk didn't work is probably because the asterisk should have been escaped, see the edit to my answer. –  Bob Mar 13 '12 at 10:55

3 Answers 3

up vote 8 down vote accepted

Add a * wildcard at the beginning.

find . -path *content/docs/file.xml

Edit:

The correct way is actually to escape the *s, e.g.:

find . -path \*content/docs/file.xml

or enclose the pattern in quotes, e.g.:

find . -path "*content/docs/file.xml"

As the man page describes it:

$ find . -name *.c -print

find: paths must precede expression

This happens because *.c has been expanded by the shell resulting in find actually receiving a command line like this:

find . -name bigram.c code.c frcode.c locate.c -print

That command is of course not going to work. Instead of doing things this way, you should enclose the pattern in quotes or escape the wild‐ card:

$ find . -name \*.c -print

Although it could work without escaping, there's nothing wrong with doing it the correct way ;)

share|improve this answer

find has a -wholename option too find $top_dir -wholename *string*

find /usr -wholename *in/abiw*

>/usr/bin/abiword
share|improve this answer
    
I don't know the full path, only partial, so "-wholename" won't work. –  user69817 Mar 13 '12 at 9:02
    
the flag is misleading, see my example... it just lets you extend the string into a directory if you know it –  technosaurus Mar 13 '12 at 9:38
find . -type f | grep "content/docs/file.xml"

or just

locate content/docs/file.xml
share|improve this answer
    
locate is an interesting option, but it searches the whole disk, I'd like to have an ability to specify the base search directory or at least to specify using param, that search should be made from this directory (like your first option does), not from the root. –  user69817 Mar 13 '12 at 8:56

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.