Как я могу заставить grep не распечатывать ошибки «Нет такого файла или каталога»?

217

Я перебираю большую кучу кода, управляемого git, и всякий раз, когда я делаю grep, я вижу кучу сообщений в форме:

> grep pattern * -R -n
whatever/.git/svn: No such file or directory

Есть ли способ, которым я могу заставить эти линии исчезнуть?

Alex
источник
1
В эти дни я бы рекомендовал использовать ag, ackили cgrepвместо этого - они намного быстрее / лучше, чем grepдля поиска в хранилищах кода.
lunixbochs
Если вы просматриваете код и стараетесь избегать определенных каталогов, возможно, вам стоит взглянуть на ack. Это grep с поддержкой исходного кода, и поэтому он будет активно игнорировать такие каталоги VCS (а также резервные копии vi и emacs, не исходные файлы и т. Д.).
Брайан Агнью
2
Как пользователь может получать No such file or directoryсообщения для существующих файлов и / или каталогов? Или, наоборот, как можно grep *получить имена файлов, которые не существуют? Это условие гонки, когда какой-то другой процесс манипулирует деревом каталогов (создавая, переименовывая и удаляя файлы) во время grepработы?
Скотт

Ответы:

300

Вы можете использовать флаг -sили --no-messagesдля подавления ошибок.

-s, --no-messages подавляют сообщения об ошибках

grep pattern * -s -R -n
Dogbert
источник
14
@Alex @Dogbert Это отвечает на вопрос, но '-s' может маскировать проблемы, например, когда вы используете xargs с grep. Попробуйте создать 2 файла в директории 'aaa.txt' и 'a b.txt', каждый из которых содержит строку 'some text'. Команда /bin/ls -1 | xargs grep 'some text'выдаст вам «нет такого файла или каталога», потому что она разбивает файл «b.txt» на 2 аргумента. Если вы подавите, вы не заметите, что пропустили файл.
Кельвин
@ Кельвин делает, например, если я использую findи использую print0с xargs -0Решает ли это проблему? Спасибо
Лука
1
@ Лука Это должно решить проблему. Вы не столкнетесь с проблемами, если будете всегда использовать эти параметры NUL, но если вы этого не сделаете, это почти гарантировано (ИМХО), что вы забудете в самый неподходящий момент.
Кельвин
это работает на Mac OS X, где другие опции (--quiet) не
работают
59

Если вы просматриваете git-репозиторий, я бы порекомендовал вам использовать git grep. Вам не нужно проходить -Rили путь.

git grep pattern

Это покажет все совпадения из вашего текущего каталога вниз.

Стив Прентис
источник
5
+1 за полезную специфическую для git команду. Не будет работать для SVN, хотя :-)
Кадриан
2
+1 Эта команда git, которую я пропустил - позволяет мне искать строку из состояния дерева при любом коммите (добавляя коммит после «pattern»).
Кельвин
1
С помощью бегущего плагина Ggrepпоиск также начинается с вершины каталога Git, а не из текущего каталога.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
Похоже, это значительно быстрее, чем стандартный grep. (Возможно, он игнорирует двоичные файлы и т. Д. Не знаю, но полезно.)
Даниил
10

Подобные ошибки обычно отправляются в поток «стандартных ошибок», который можно передать в файл или просто заставить исчезнуть в большинстве команд:

grep pattern * -R -n 2>/dev/null
lunixbochs
источник
Отвечает на вопрос, но может маскировать проблемы. Смотрите мой комментарий под ответом Догберта.
Кельвин
5

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

Обычно я не беспокоюсь, выполняя задачи sysadmin через консоль, но внутри скриптов я ищу текстовые файлы с помощью команды «find», а затем grep каждый из них:

find /etc -type f -exec grep -nHi -e "widehat" {} \;

Вместо того:

grep -nRHi -e "widehat" /etc
Исаак Урибе
источник
4

Я обычно не позволяю grep делать рекурсию самостоятельно. Обычно есть несколько каталогов, которые вы хотите пропустить (.git, .svn ...)

Вы можете делать умные псевдонимы с такими позициями:

find . \( -name .svn -o -name .git \) -prune -o -type f -exec grep -Hn pattern {} \;

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

cadrian
источник
1
+1. Это намного лучше, чем подавление ошибок. Тем не менее, я думаю, что вы забыли -execдо своего grep.
Кельвин
1
Что это значит? \( -name .svn -o -name .git \)
Сбхатла
Почему бы не использовать флаги grep --exclude или --exlcude-dir?
Чойлтон Б. Хиггинботтом
1
@sbhatla круглые скобки создают порядок операций для команды find. stackoverflow.com/questions/24338777/…
Чойлтон Б. Хиггинботтом
4

Вы пробовали эту -0опцию в xargs ? Что-то вроде этого:

ls -r1 | xargs -0 grep 'some text'
cokedude
источник
2
для поиска вы должны добавить -print0find -print0 | xargs -0 grep 'text'
aliva
1

Используйте -Iв grep.

Пример: grep SEARCH_ME -Irs ~/logs.

Bala
источник
1
-Iскачет бинарные файлы - это эквивалентно --binary-files=without-match. Это не подавляет сообщения «Нет такого файла или каталога».
mwfearnley
0

Перенаправить stderrк , stdoutа затем инвертировать матча использовать Grep ( в -v) , чтобы исключить строку предупреждения / ошибки , что я хочу , чтобы скрыть:

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"
talleyho
источник