Обычно при поиске использующий grep, команда, которую я использовал, была этим:
grep -nri "String"
тогда как большинство моих коллег делает это:
grep -nri "String" *
Что делает последний ( *
часть)?
grep
с -r
флаг воздействует на все файлы в указанных каталогах рекурсивно:
-r, --recursive
Read all files under each directory, recursively, following
symbolic links only if they are on the command line. Note that
if no file operand is given, grep searches the working
directory. This is equivalent to the -d recurse option.
По умолчанию, если никакие каталоги не даны, то grep
обработает все файлы в текущем каталоге.
В grep -r ... *
, затем, оболочка расширяется *
во все файлы и каталоги в текущем каталоге (обычно кроме тех, которые начинают с a .
), и grep
затем работы рекурсивно над ними.
Так, если у Вас был каталог, который содержал, например:
.git/
.gitignore
foo/
foo/.foo2
foo/link2 -> /foo2/bar2
bar
link1 -> /foo/bar
где имена, заканчивающиеся /
каталоги, затем grep -r
также обработал бы .gitignore
файл и все в .git
, но grep -r ... *
был бы exand к grep -r ... foo bar
, и закончился бы, исключая .gitignore
и .git
(но это включало бы foo/.foo2
).
Также отметьте точку о символьных ссылках - если один из файлов в расширении *
если бы символьная ссылка был, то цель символьной ссылки была бы обработана, если бы Вы использовали *
. Таким образом с *
, /foo/bar
будет обработан как цель link1
, но нет /foo2/bar2
как цель link2
.
Полный эффект:
w/o * with *
.git/ + -
.gitignore + -
foo/ + +
foo/.foo2 + +
foo/link2 -> /foo2/bar2 - -
bar + +
link1 -> /foo/bar - +
То, которое Вы хотите сделать, конечно, зависит от того, хотите ли Вы те файлы и каталоги, включенные в поиск; но я склонен предпочитать иметь grep
самостоятельно сделайте исключение и включая использование --exclude
/--include
и другие опции.