I'm using bash under Ubuntu.

Currently this works well for the current directory:

catdoc *.doc | grep "specificword" 

But I have lots of subdirectories with .doc files.

How can I search for, let's say, "specificword" recursively?

  • 1
    and maybe also return the name of the file that contains the word?
    – Tom
    Aug 31 '11 at 12:02

Use find for recursive searches:

find -name '*.doc' -exec catdoc {} + | grep "specificword"

This will also output the file name:

find -name '*.doc' | while read -r file; do
    catdoc "$file" | grep -H --label="$file" "specificword"

(Normally I would use find ... -print0 | while read -rd "" file, but there's maybe a .0001% chance that it would be necessary, so I stopped caring.)

  • Thanks grawity, the first suggestion works quit well. Is there a way to print the file name? it's only printing the phrase in which it has been found.
    – Tom
    Aug 31 '11 at 12:09
  • 1
    @user: Try the second suggestion, which, by the way, is titled "This will also output the file name".
    – user1686
    Aug 31 '11 at 12:10
  • can probably simplify a bit: find -name \*.doc -exec sh -c "catdoc '{}' | grep -q 'specificword' && echo {}" \; Aug 31 '11 at 14:20

You might want to look at recoll which is a full-text search tool for Linux and Unix systems supporting many different document formats. However, it is index-based, i.e., it has to index the documents you want to search in before the actual search. (Thanks to pabouk for pointing this out).

There is a GUI and a command line, too.

See the documentation for further infos.

  • 1
    Maybe it is worth to note that Recoll provides indexed search. First it has to index the documents then it can search through the indexes.
    – pabouk
    Dec 17 '13 at 8:25

Grep should find binary matches with:

find /path/to/dir -name '*.doc' exec grep -l "specificword" {} \;

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.