Intereting Posts
Использование ресурсов другого устройства для выполнения программного обеспечения ключевое слово grom () в bash бросает неожиданный '(' токен Как отправить AT-команды на последовательный интерфейс в Yocto Linux? Вызов сценария ожидания в цикле сценария bash "Проверка подключения к Интернету с одним слоем" не может сохранить изображение докера: Ошибка ответа от демона: chtimes: недопустимый аргумент Как просмотреть только первую строку или таблицу в MySQL? Какая версия Linux для практического использования сценариев / программирования Unix? Нет настроек CentOS Windows 8 GRUB при перезагрузке Как очистить содержимое файла журнала ретрансляции в оболочке? Изображения команды движения смехотворны Практическое использование опции `set -k` в bash Msgstr "Символическая ссылка не разрешена или ссылка недоступна" / Apache on CentOS 6 Переносимость исполняемого файла другой машине Linux Есть ли какая-либо команда, которая имитирует двойной список вкладок в bash?

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

Недавно я получил эту 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 

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

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

Например

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

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

 grep -i "foo" /tmp/herp foo 

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

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

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

man grep :

-H, –with-filename

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

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

Первый пример эквивалентен запуску 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 

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