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

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

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

неправильно-о-все
источник
Связанный: stackoverflow.com/a/25234419/54964
Лео Леопольд Герц 준영

Ответы:

24

с помощью 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

matchew
источник
6

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

johndoe@johndoe-desktop:/$ grep -rnP 'YII_CORE_PATH' ./ 2> /dev/null | grep -v .svn
ortang
источник
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
Джайпал Сингх
источник
1
Вы не можете выполнить поиск чего-то, что уже было перенаправлено в / dev / null.
Чороба
@choroba исправили ответ. Имеется в виду, чтобы написать 2>&1вместо 2> /dev/nullпервого предложения.
Джайпал Сингх
Да, вы должны перенаправить stderrв stoutпервую очередь.
Ортанг
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'
Fluffball
источник