Греп, ігноруйте попередження


50

Я намагаюся знайти каталог встановлення певного пакету. У мене є певне ключове слово, за допомогою якого я намагаюся знайти певний файл.

Під час grep я хочу включити лише тип файлу cpp або h . Я не хочу, щоб греп показував попередження, як дозвол відхилений або не вдалося знайти Каталог . Я просто хочу, щоб він відображав відповідні файли, більше нічого. Підкажіть, будь ласка, як я можу це зробити?

В даний час я використовую

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./

Відповіді:


56

Ці попередження спрямовані на stderrпотік, на відміну від стандартного дескриптора файлу. Ви можете заглушити висновок stderr, додавши 2>/dev/nullв кінець своєї команди.


Якщо конкретніше find . 2>/dev/null | grep 404.htmlвиглядатиме команда
csga5000

30

Більш безпосередньо, ніж фільтрувати попередження, ви можете відключити їх, додавши -s:

grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./

Існують деякі проблеми сумісності з цією опцією. Однак це не повинно бути проблемою для особистого використання.

-s, --no-messages: придушення повідомлень про помилки щодо неіснуючих чи нечитабельних файлів. Примітка щодо переносимості: на відміну від GNU grep, 7-е видання Unix grep не відповідало POSIX, оскільки йому бракувало -q, а його -s варіант поводився як -q варіант GNU grep. У грецькому стилі USG також не вистачало -q, але його -s варіант поводився як GNU grep. Сценарії портативної оболонки повинні уникати і -q, і -s, а також слід перенаправляти стандартні та вихідні помилки на / dev / null. (-s визначено POSIX.)


Щойно я встановив 13.04, і я отримую помилки, яких я не отримував з 12.04. Можливо, щось змінилося? Я думав, що це круто, що grep перестане попереджати про те, щоб файли були каталогами, оскільки в більшості випадків мені просто все одно!
Alexis Wilke

Вибачте, я ще 12.10, тому не можу підтвердити це.
Себастьян vom Meer

5

Раніше я отримував тону таких дратівливих повідомлень:

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повідомлень, але також пригнічує інші повідомлення, які можуть бути кориснішими. Наприклад, якщо ви робите вкладений пошук */*/*і немає такого файлу цього шаблону, це не скаже вам про це.


хороше пояснення
aldr

1

Альтернативний підхід замість того, щоб робити 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" "{}" \; 

0

Роблячи рекурсивні пошуки в певних файлах, вам набагато краще використовувати 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.