1441

How can I use grep to show just file-names (no in-line matches) on Linux?

I am usually using something like:

find . -iname "*php" -exec grep -H myString {} \;

How can I just get the file-names (with paths), but without the matches? Do I have to use xargs? I didn't see a way to do this on my grep man page.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
cwd
  • 53,018
  • 53
  • 161
  • 198
  • 7
    You mean, you want the filenames that have at least one match? – leonbloy Jul 09 '11 at 22:27
  • 6
    Great question. I actually started using this to open a list of files returned by grep in Vim. `vim $(grep -rl Something app/)` – David Tuite Mar 20 '13 at 10:49
  • 2
    You cannot list files using grep command, it is basically used to fetch desired text from a file or a list. For instance, ps aux | grep 'apt-get' or grep 'text-to-find' /path/to/file/ – iamjayp Mar 17 '17 at 08:09
  • 1
    @iamjayp Ummm, you can too list files using the grep command. `grep -lr 'text-to-find' ./*` works quite nicely! – ErikE Nov 13 '21 at 21:58
  • @AndriySimonov I'm not against having it here (and there is a gazillion precedence of grep questions) but it probably belongs technically to SuperUser or Ubuntu or so. To Ryan: I'm surprised it was closed instead of being migrated. – Peter - Reinstate Monica Feb 15 '23 at 07:48
  • 1
    @Peter Moderators can only migrate questions that are less than 60 days old. Therefore, for old questions that are nevertheless off-topic here because they're not about programming, closing them is our only option. I feel strongly that such questions should not be *deleted*, because that is destructive of value, but reopening them also makes no sense because it sets a bad example to users who are unaware that SO limits themselves only to programming questions. – Cody Gray - on strike Feb 15 '23 at 09:53

3 Answers3

2201

The standard option grep -l (that is a lowercase L) could do this.

From the Unix standard:

-l
    (The letter ell.) Write only the names of files containing selected
    lines to standard output. Pathnames are written once per file searched.
    If the standard input is searched, a pathname of (standard input) will
    be written, in the POSIX locale. In other locales, standard input may be
    replaced by something more appropriate in those locales.

You also do not need -H in this case.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Random832
  • 37,415
  • 3
  • 44
  • 63
192

From the grep(1) man page:

  -l, --files-with-matches
          Suppress  normal  output;  instead  print the name of each input
          file from which output would normally have  been  printed.   The
          scanning  will  stop  on  the  first match.  (-l is specified by
          POSIX.)
Ignacio Vazquez-Abrams
  • 776,304
  • 153
  • 1,341
  • 1,358
80

For a simple file search, you could use grep's -l and -r options:

grep -rl "mystring"

All the search is done by grep. Of course, if you need to select files on some other parameter, find is the correct solution:

find . -iname "*.php" -execdir grep -l "mystring" {} +

The execdir option builds each grep command per each directory, and concatenates filenames into only one command (+).

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131