Ubuntu grep, find и т. д.: вывод «Отказано в доступе» и «Нет такого файла или каталога»

Ubuntu grep, find и т. д.: вывод «Отказано в доступе» и «Нет такого файла или каталога»

Когда я использую 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

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

решение1

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

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

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

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

решение2

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

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

решение3

Перенаправление 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

решение4

Использование "|&" перед grep -v поможет справиться с этой проблемой, например:

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

Связанный контент