17

Когда я использую grep или find , меня всегда раздражают уведомления "Отказано в доступе" и "Нет такого файла или каталога", что-то вроде этого:

johndoe@johndoe-desktop:/$ grep -rnP 'YII_CORE_PATH' ./ | grep -v .svn
grep: ./lib/ufw/user6.rules: Permission denied
grep: ./lib/ufw/user.rules: Permission denied
grep: ./lib/init/rw/udev/watch/27: No such file or directory
grep: ./lib/init/rw/udev/watch/26: No such file or directory
grep: ./lib/init/rw/udev/watch/25: No such file or directory

Как я могу избежать их и сделать так, чтобы я видел только релевантные данные, то есть то, что я действительно ищу?

5 ответов5

22

с помощью grep вы можете указать флаг -s, который делает то, что сказал @ortang

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

с найти, насколько я знаю, ответ @ortangs является лучшим. что-то вроде

find / -name "myfile" -type f -print 2>/dev/null

6

Попробуйте перенаправить stderr в /dev/null .

johndoe@johndoe-desktop:/$ grep -rnP 'YII_CORE_PATH' ./ 2> /dev/null | grep -v .svn
5

Перенаправление strerr в /dev/null (он же black hole) является хорошим способом подавления ошибок, в которых отказано в разрешении.

Однако обратите внимание, что эта рана подавляет не только сообщения об permission denied но и ВСЕ сообщения об ошибках.

Если вы хотите сохранить сообщения об ошибках, отличных от permission denied то вы можете сделать что-то вроде этого -

grep -rnP 'YII_CORE_PATH' ./ 2>&1 | grep -v 'permission denied' > error.log

Если вы не хотите сохранять их, то все будет в порядке -

grep -rnP 'YII_CORE_PATH' ./ 2> /dev/null | grep -v .svn
3
johndoe@johndoe-desktop:/$ sudo grep -rnP 'YII_CORE_PATH' ./ | grep -v .svn

Используйте команду sudo чтобы поднять команду, чтобы иметь административные привилегии.

0

Использование «| &» до того, как с ним справится grep -v, например

grep -rnP 'YII_CORE_PATH' ./ | grep -v .svn |& grep -v 'permission denied'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .