6

Grep with -r was not working for me.

I then made a test situation. The directory /home/den/backup now contains a file with the word washer in it. I also made a subdirectory within /home/den/backup. In that directory a file contains the word washer. The following should return two hits at /home/den/backup/great.txt and /home/den/backup/aaa/info.txt

If I issue

grep -r "washer" /home/den/backup/*.*

the result is one hit.

If I issue

grep -r "washer" /home/den/backup/aaa/*.*

the result is one hit.

Shouldn't the first one have also found the second one, which is in one if its sub-directories?

  • Also see: askubuntu.com/a/1028732/158442 – muru Sep 7 '18 at 2:46
  • *.* looks Windows-style. I prefer find . -type f -name '*' -exec grep 'washer' \{\} \+ because grep -r is prone not to do what you want: Either it does not recurse (because directories are usually not named like *.txt) or it throws errors because directories not being regular files. – rexkogitans Sep 7 '18 at 6:11
  • 1
    @Zanna with the updated title, looks more like a dupe of the post I linked to. – muru Sep 7 '18 at 7:39
  • @muru so it does :D – Zanna Sep 7 '18 at 8:53
15

You can see what's happening here by setting the shell into debug mode using set -x

$ set -x
$ grep -r "washer" /home/steeldriver/backup/*.*
+ grep --color=auto -r washer /home/steeldriver/backup/great.txt
washer

i.e. the shell is expanding *.* and matching the single file great.txt - so grep searches that single file.

If you want to recursively search the whole directory, just give the directory as the argument:

$ grep -r "washer" /home/steeldriver/backup/
+ grep --color=auto -r washer /home/steeldriver/backup/
/home/steeldriver/backup/aaa/info.txt:washer
/home/steeldriver/backup/great.txt:washer

(You can turn debug mode off again using set +x)

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