У меня установлен Cygwin, и когда я ищу исходный код с помощью этой команды, ничего не отображается, даже если у меня есть эта строка в файле
$ echo foo > bar
$ find . -name '*' | grep foo
Ничего не отображается. Эта команда отлично работает на GNU+Linux.
$ grep foo bar
решение1
Как уже упоминалось, find выводит список найденных файлов в stdout, grep обычно ожидает поиска в stdout, если вызван таким образом.
Можно также найти трубу xargs
, и это будет "создавать и выполнять командные строки из стандартного ввода", как в
$ find . | xargs grep foo
Если у вас сумасшедшие имена файлов, с переводами строк и прочим, то это будет лучше:
$ find . -type f -print0 | xargs -0 grep foo
и -type f
будут найдены только обычные файлы, поэтому не нужно пытаться выполнить grep по каким- .
либо ..
каталогам или «забавным» файлам.
решение2
find . -name '*' # This will produce a list of *file names*
Затем вы передаете список имен файлов grep
на stdin, он обрабатывает список как текст и ищетfoo
У вас нет имени файла, foo
поэтому он ничего не возвращает.
Для рекурсивного поиска текста в файлах вы можете просто использовать
grep -R foo somefolder/
решение3
Когда я ищу исходный код с помощью этой команды, ничего не отображается.
$ echo foo > bar
$ find . -name '*' | grep foo
find
ищет имена файлов, которые соответствуют желаемым критериям: Имя, Размер, Тип файла и возвращает список соответствующих имен файлов. Он не возвращаетсодержаниесоответствующих файлов.
Когда этот список имен файлов передается grep
с помощью оператора pipe, grep
мы увидим строку bar
(имя файла) инет foo
(содержимое файла bar
).
grep
следовательно, не находит совпадений и нечего выводить.
Примечание:
grep
можно искать файлы напрямую. Вам не нужно использоватьfind
. pipe|
илиxargs
как предложено в другом ответе.
Следующая команда работает в Cygwin:
grep --exclude-dir=* "foo" ./*
Пример:
DavidPostill@Hal /f/test
$ cat bar
foo
DavidPostill@Hal /f/test
$ grep --exclude-dir=* "foo" ./*
./bar:foo
Дальнейшее чтение
- Алфавитный указатель командной строки Bash для Linux- Отличный справочник по всем вопросам, связанным с командной строкой Bash.
- находить- Поиск в иерархии папок имен файлов, соответствующих требуемым критериям: имя, размер, тип файла.
- грэп- Поиск определенного текста в файле(ах).
решение4
Я думаю, ты этого хочешь.
find . -name '*' -type f -exec grep foo /dev/null {} \;
Вам нужно grep только для файлов, а не для каталогов или специальных файлов. /dev/null заставляет grep показывать имя файла. Вы можете захотеть избавиться от '-name '*', но если вы это сделаете, то будут grep'ны файлы с точками.
Вы также можете запустить
grep -r foo .