2
find . -name "*.java" -exec grep "foo" {} \;

Это просто печатает совпадения, без имени файла.

find . -name "*.java" -exec grep "foo" /dev/null {} \;

Но это также печатает имя файла.

Зачем? Каковы механизмы find/grep, которые заставляют имя файла печататься, когда /dev /null вставляется в микс?

PS - да, я знаю, что могу сделать "grep -H"

2 ответа2

5

Если вы не используете ни параметр -h, ни параметр -H, то grep запишет имя файла, если в качестве аргументов указано более одного файла. Поэтому, если вы добавите /dev /null в качестве аргумента для grep, у вас всегда будет более одного, поэтому имя файла всегда будет записываться. Но да, использование ˛ grep -H - самый безопасный способ всегда писать имя файла.

1

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

Используйте grep -h чтобы отключить имена файлов в выходных данных, и grep -H чтобы включить их.

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