Я пытаюсь найти каталог установки определенного пакета. У меня есть определенное ключевое слово, с помощью которого я пытаюсь найти определенный файл.
Во время grep я хочу включить только тип файла cpp или h . Я не хочу, чтобы grep отображал предупреждений , таких как Разрешение отклонено или Не удалось найти каталог . Я просто хочу, чтобы он отображал совпадающие файлы, больше ничего. Пожалуйста, предложите, как я могу это сделать?
В настоящее время я использую
grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./
Более прямо, чем фильтрация предупреждений, вы можете отключить их, добавив -s
:
grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./
Есть некоторые проблемы совместимости с этой опцией. Тем не менее, это не должно быть проблемой для личного использования.
-s, --no-messages: Подавлять сообщения об ошибках несуществующих или нечитаемых файлов. Примечание по переносимости: в отличие от GNU grep, 7-й выпуск Unix grep не соответствовал POSIX, поскольку в нем отсутствовал параметр -q, а его параметр -s вел себя так же, как и параметр GNU-grep -q. В grep в стиле USG также не хватает -q, но его опция -s ведет себя как GNU grep. Переносимые сценарии оболочки должны избегать как -q, так и -s и вместо этого перенаправлять стандартный вывод и вывод ошибок в / dev / null. (-s определяется POSIX.)
blockquote>
Раньше я получал массу раздражающих сообщений, подобных этому:
grep: commands: Is a directory
grep: events: Is a directory
grep: views: Is a directory
Причина в том, что флаг --directories
по умолчанию установлен на read
. Я изменил его на recurse
; если вы не хотите, чтобы он автоматически выполнял рекурсивный поиск, вы можете использовать вместо него skip
.
Самый простой способ справиться с этим постоянно - это установить его в переменной окружения. В ~/.bash_profile
или ~/.bashrc
в зависимости от вашего дистрибутива:
export GREP_OPTIONS='--directories=recurse'
Теперь он автоматически подавляет эти сообщения каждый раз, когда я использую grep.
Другим вариантом является флаг --no-messages
, сокращение -s
. Это также избавит от сообщений Is a directory
, но также подавит другие сообщения, которые могут быть более полезными. Например, если вы выполняете вложенный поиск в */*/*
, и такого файла этого шаблона не существует, он вам об этом не скажет.
При выполнении рекурсивного поиска в определенных файлах вам гораздо лучше использовать ack-grep
. Синтаксис здесь будет следующим:
ack-grep -i "My term" --cpp --h
Чтобы удалить сообщения об ошибках разрешения, вы можете запустить ту же команду с sudo
:
ack-grep -i "My term" --cpp --h
Но в конце концов, если вы хотите для поиска установленных пакетов просмотрите следующие варианты: https://www.google.com/search?q=ubuntu%20search%20inside%20installed%20packages
Альтернативный подход вместо выполнения grep
рекурсивно с -ir
состоял бы в том, чтобы позволить команде find
(которая является рекурсивной по умолчанию) обрабатывать разрешения с флагом -readable
и пути для исключения с флагами -not -path "*.svn*"
, и затем передайте файл в grep
. Исключение каталогов выполняется через -type f
для поиска только обычных файлов.
$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h" -readable -exec grep "my terms" "{}" \;
Эти предупреждения направлены на поток stderr
, в отличие от стандартного дескриптора файла. Вы можете отключить вывод stderr, добавив 2>/dev/null
в конец вашей команды.