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

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

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

Есть ли способ, чтобы эти строки исчезли?

Ответ 1

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

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

grep pattern * -s -R -n

Ответ 2

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

git grep pattern

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

Ответ 3

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

grep pattern * -R -n 2>/dev/null

Ответ 4

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

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

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

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

Ответ 5

Пробовали ли вы параметр -0 в xargs? Что-то вроде этого:

ls -r1 | xargs -0 grep 'some text'

Ответ 6

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

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

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

Вместо:

grep -nRHi -e "widehat" /etc

Ответ 7

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

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