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.

I want to search for "this table..." string under /home/myuser directory recursively, ie in all files under /home/myuser and in all directories and sub-directories under /home/myuser.

/home/myuser directory is set to a environment variable: $MYUSR

The search must be case insensitive, and it should give me the full path name of the files containing "this table..." string.

I try:

grep -R "this table..." $MYUSR

but I'm not sure if it really searches because I wait for a long time and it does not return any result and it never ends.

I also want to know how to do the same search recursively in the directory I'm standing in, maybe like:

grep -R "this table..." .

How do I do it?

share|improve this question

2 Answers 2

up vote 2 down vote accepted
  find $MYUSR -type f -print0 | xargs -0 -n 10 grep -i -l 'this table...'

The options to find are

  • -type f - we don't want to search directories (just files in them), devices etc
  • -print0 - we want to be able to handle filenames containing spaces

The options to xargs are

  • -0 - Because of find -print0
  • -n 10 - Run grep on 10 files at a time (useful when not using grep's -l)

The options to grep are

  • -i - ignore case
  • -l - just list filenames (not all matching lines)
  • -f - treat dots in search expression as plain ol' dots.

To start in the current directory replace $MYUSR with .


Update (a fellow superuserer suggested find -type f -exec grep -i "this table..." +)

$ ls -1
2011
2011 East
2011 North
2011 South
2012


$ find -type f -exec grep -i 'this table...'
find: missing argument to `-exec'

$ find -type f -exec grep -i 'this table...' +
find: missing argument to `-exec'

$ find -type f -exec grep -i 'this table...' {} \;
this table... is heavy
THIS TABLE... is important
this table... is mine
this table... is all alike
this table... is twisty

But that's not useful, you want filenames

$ find -type f -exec grep -i -l 'this table...' {} \;
./2011 East
./2011
./2011 North
./2011 South
./2012

OK but often you want to see the matching line content too

If you want filenames AND matching line content, I do it this way:

$ find -type f -print0 | xargs -0 -n 10 grep -i 'this table...';
./2011 East:this table... is heavy
./2011:THIS TABLE... is important
./2011 North:this table... is mine
./2011 South:this table... is all alike
./2012:this table... is twisty

But without "old skool" -print0 and -0 you'll get a mess

$ find -type f | xargs -n 10 grep -i 'this table...';
./2011:THIS TABLE... is important
grep: East: No such file or directory
./2011:THIS TABLE... is important
./2011:THIS TABLE... is important
grep: North: No such file or directory
./2011:THIS TABLE... is important
grep: South: No such file or directory
./2012:this table... is twisty
share|improve this answer
    
Thanks. What is the meaning of 10 ? –  alwbtc Mar 26 '12 at 13:51
    
And How do I make the same search i the directory im standing in? –  alwbtc Mar 26 '12 at 13:51
    
@alwbtc: See updated answer –  RedGrittyBrick Mar 26 '12 at 14:01
    
No need all of this old school tricks : find -type f -exec grep -i "this table..." + is sufficient. –  sputnick Mar 26 '12 at 14:02
    
@sputnick: on my system, find complains: "find: missing argument to '-exec'" unless you add {} \; also you need grep's -l option otherwise it doesn't show filenames. If you want to see matches AND filenames you probably need xargs in the mix (or some equivalent options) –  RedGrittyBrick Mar 26 '12 at 14:30

It depends of the size of the directory and subdirectorys where you search. But ack will better fits your needs. See http://betterthangrep.com/

share|improve this answer
    
So, grep -R "this table..." $MYUSRis correct? –  alwbtc Mar 26 '12 at 13:50
    
Yes, it's correct, but add -i switch : case insensitive –  sputnick Mar 26 '12 at 13:52

Your Answer

 
discard

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

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