4

У меня установлен Cygwin, и при поиске исходного кода с помощью этой команды ничего не появляется, даже если у меня есть эта строка в файле

$ echo foo > bar
$ find . -name '*' | grep foo

Ничего не появляется Эта команда отлично работает на GNU+Linux.

$ grep foo bar

4 ответа4

9
find . -name  '*' # This will produce a list of *file names*

Затем вы передаете список имен файлов grep на stdin, он обрабатывает список как текст и ищет foo

У вас нет имени файла foo поэтому он ничего не возвращает.

Для рекурсивного поиска по файлам в поисках текста в файле вы можете просто использовать

grep -R foo somefolder/
3

Как уже упоминалось, команда find выводит список найденных файлов на стандартный вывод, grep обычно ожидает поиск через стандартный вывод, если вызывается таким образом.

Может также труба найти к xargs , и он будет " строить и выполнять командные строки из стандартного ввода ", как в

$ find . | xargs grep foo

Если у вас есть сумасшедшие имена файлов, с символами новой строки и так далее, тогда это будет лучше:

$ find . -type f -print0 | xargs -0 grep foo

и -type f найдет только обычные файлы, поэтому никаких попыток поиска не будет . или .. или любые каталоги или "смешные" файлы.

2

При поиске исходного кода с помощью этой команды ничего не появляется

$ echo foo > bar
$ find . -name '*' | grep foo

find поиск имен файлов, которые соответствуют требуемым критериям: имя, размер, тип файла и возвращает список подходящих имен файлов. Он не возвращает содержимое соответствующих файлов.

Когда этот список имен файлов передается в grep с помощью оператора pipe, grep увидит строку bar (имя файла), а не foo (содержимое bar файла).

Поэтому grep не находит соответствия, поэтому ничего не выводит.

Замечания:

  • grep может искать файлы напрямую. Вам не нужно использовать find . трубы | или xargs как предложено в другом ответе.

Следующая команда работает на Cygwin:

grep --exclude-dir=* "foo" ./*

Пример:

DavidPostill@Hal /f/test
$ cat bar
foo

DavidPostill@Hal /f/test
$ grep --exclude-dir=* "foo" ./*
./bar:foo

Дальнейшее чтение

  • Индекс AZ командной строки Bash для Linux - отличный справочник по всем вопросам, связанным с командной строкой Bash.
  • find - поиск в иерархии папок по именам файлов, которые соответствуют требуемым критериям: имя, размер, тип файла.
  • grep - Поиск файлов для конкретного текста.
0

Я думаю, ты хочешь этого.

find . -name '*' -type f -exec grep foo /dev/null {} \;

Вы хотите только grep файлы, а не каталоги или специальные файлы. / Dev / null заставляет grep показывать имя файла. Вы можете избавиться от '-name' * ', но если вы это сделаете, то точечные файлы будут выделены.

Вы также можете запустить

grep -r foo .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .