Find | grep не работает в Cygwin

Find | grep не работает в Cygwin

У меня установлен 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

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

решение4

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

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

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

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

grep -r foo .

Связанный контент