Я пытаюсь выполнить 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
на необходимость вывода имени файла перед результатом.