Сравнение двух команд поиска

12

Недавно я получил эту findстроку, но я не могу объяснить, откуда взялась разница между двумя приведенными ниже:

Пример 1

[root@centos share]# find . -exec grep -i "madis" {} /dev/null \;

./names:Madison Randy:300:Product Development

Пример 2

[root@centos share]# find . -exec grep -i "madis" {} \;

Madison Randy:300:Product Development

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

VVelev
источник

Ответы:

17

Вы говорите grep для поиска 2 мест. grep показывает полное местоположение только при поиске нескольких местоположений.

Например

touch /tmp/herp /tmp/derp
cd /tmp
echo "foo" > herp
echo "foo" > derp

Обратите внимание, что если я ищу только 1 файл, grep опускает имя файла

grep -i "foo" /tmp/herp
foo

Но если я укажу несколько мест поиска, grep скажет, где он нашел каждое совпадение

grep -i "foo" herp derp
/tmp/derp:foo
/tmp/herp:foo

Добавив в /dev/nullнего команду grep, выведите полный путь, указав 2 аргумента.

spuder
источник
1
+1, но вы забыли упомянуть «очевидное»: «Причина, по которой добавленный файл состоит в /dev/nullтом, чтобы убедиться, что все, что связано с grep-ed, не будет найдено в (пустом) /dev/nullфайле, поэтому выдаются только правильные местоположения»
Оливье Дюлак
Но также, /dev/nullвыполняя поиск, вы не тратите время на поиск через непустой фиктивный файл. И наконец, цель поиска /dev/nullочевидна для тех, кто знаком с этой идиомой.
Алексис
5

man grep:

-H, --with-filename

Напечатайте имя файла для каждого совпадения. Это значение по умолчанию, когда для поиска требуется более одного файла.

Разница заключается в том, что в обоих случаях grep вызывается с одним или двумя аргументами файла. Вместо добавления /dev/nullвы можете позвонить grepс аргументом -H. Может быть, /dev/nullповедение более широко поддерживается.

Хауке Лагинг
источник
3
grep -Hне переносимо - /dev/nullтрюк работает без GNU grep.
Крис Даун
4

Первый пример эквивалентен запуску grep над двумя файлами для каждого файла, найденного в результате findвыражения. Например, если findнайдет три файла a.txt, b.txtа c.txtзатем grepзапустится как

grep -i "madis" a.txt /dev/null
grep -i "madis" b.txt /dev/null 
grep -i "madis" c.txt /dev/null

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

Принимая во внимание, что второй пример эквивалентен

grep -i "madis" a.txt
grep -i "madis" b.txt 
grep -i "madis" c.txt 

В этом случае имя файла не будет напечатано для совпадений, поскольку есть только один аргумент.

MKC
источник