Почему конвейеризация find и grep ничего не возвращает?

Почему конвейеризация find и grep ничего не возвращает?

Я пытаюсь выполнить grepпоиск внутри указанных файлов, которые возвращаются find:

find . -type d -name 'mydir*' -exec find '{}' -name '*.java' \; | grep 'MyClass'

Это не работает.

Между тем, это работает.

grep 'MyClass' $(find . -type d -name 'mydir*' -exec find '{}' -name '*.java' \;)

В чем проблема моего первого примера?

решение1

В первом случае вы выполняете grep-список имен файлов, возвращаемый функцией find, тогда как во втором случае список имен файлов является аргументом grep, поэтому grep будет выполнять поиск внутри файлов.

Pipe — это стандартный ввод, а не именованный файл. Вот почему grep ведет себя по-другому.
Из man grep:

grep ищет в именованных входных ФАЙЛАХ (или в стандартном вводе, если файлы не указаны или в качестве имени файла указан один дефис-минус (-)) строки, содержащие совпадение с указанным ШАБЛОНОМ.

решение2

Потому что в первом случае grepон пытается найти «MyClass» в именах файлов, а во втором — в содержимом файла.

Первый равен

find . -type d -name 'mydir*' -exec find '{}' -name '*MyClass*.java' \;

в то время как второй равен

find . -type d -name 'mydir*' -exec sh -c \
"find '{}' -name '*.java' -exec grep 'MyClass' {} \;" \;

решение3

Я думаю, ваша findкоманда должна быть такой:

find . -type f -path 'mydir*.java'| xargs grep -H 'MyClass'

Который находит файлы mydirс .javaрасширением и содержащиеМои занятия. -Hуказывает grepна необходимость вывода имени файла перед результатом.

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