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