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


217

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

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

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


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

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

Отвечает на вопрос, но может маскировать проблемы. Смотрите мой комментарий под ответом Догберта.
Кельвин

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 {} \;

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


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'

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

1

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

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


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

0

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

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.