<> == How can I recursively search all files for a string? == If you are on a typical GNU or BSD system, all you need is one of these: {{{#!highlight bash # Recurse and print matching lines (GNU grep): grep -r -- "$search" . # Recurse and print only the filenames (GNU grep): grep -r -l -- "$search" . }}} If your `grep` lacks a `-r` option, you can [[UsingFind|use find]] to do the recursion: {{{#!highlight bash # Portable but slow find . -type f -exec grep -l -- "$search" {} \; }}} This command is slower than it needs to be, because {{{find}}} will call {{{grep}}} with only one file name, resulting in many {{{grep}}} invocations (one per file). Since {{{grep}}} accepts multiple file names on the command line, {{{find}}} can be instructed to call it with several file names at once: {{{#!highlight bash # Fast, but requires a recent find find . -type f -exec grep -l -- "$search" {} + }}} The trailing '+' character instructs {{{find}}} to call {{{grep}}} with as many file names as possible, saving processes and resulting in faster execution. This example works for POSIX-2008 {{{find}}}, which ''most'' current operating systems have, but which may not be available on legacy systems. Traditional Unix has a helper program called {{{xargs}}} for the same purpose: {{{#!highlight bash # DO NOT USE THIS find . -type f | xargs grep -l -- "$search" }}} However, if your filenames contain spaces, quotes or other metacharacters, this will fail catastrophically. BSD/GNU `xargs` has a `-print0` option: {{{#!highlight bash find . -type f -print0 | xargs -0 grep -l -- "$search" }}} The {{{-print0}}} / {{{-0}}} options ensure that any file name can be processed, even one containing [[BashFAQ/020|blanks, TAB characters, or newlines]]. ---- CategoryShell