Назад | Перейти на главную страницу

Как я могу сказать grep искать в файле, который у меня есть разрешение?

Когда я звоню

cd /
grep -r "some_str" .

затем я вижу много файлов, напечатанных на экране, и в конце строки вижу «: Permission denied». Как я могу сказать bash искать только в файле, на который у меня есть разрешение. Очевидно, это будет быстрее, чем стандартный grep.

Использовать find / -readable -print0 | xargs -0 grep -H "some_str" вместо того grep -r. (Требуется GNU find, но grep -r GNUish, поэтому я подозреваю, что это не проблема.)

Но на самом деле не так уж "очевидно", что это быстрее; grep -r позволяет open() позвоните и узнайте, что вы не можете его прочитать, а find версия должна stat() будет первый grep делает open() - и самая дорогая часть этого для файлов, которые не читаются, - это преобразование ядром имен путей в узлы индекса файловой системы. (На самом деле поиск доступных для чтения файлов будет составлять большую часть времени выполнения, в противном случае для файлов любого значительного размера.) Вполне вероятно, что более быстрый подход - просто добавить 2>/dev/null к grep -r поэтому нет потери времени на вывод сообщений об ошибках на медленные терминалы.

Вы могли бы использовать grep -s игнорировать сообщения о нечитаемых файлах.

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

Вы можете попробовать найти:

find / -perm o=r -or -user <user> -exec grep whatever '{}' \;

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

ОБНОВИТЬ: есть find -readable, как подсказывает другой ответ.

Вот забавный способ сделать это с помощью GNU Parallel, предполагая, что ваш find (1) не поддерживает -readable флаг:

find / -type f 2>/dev/null | parallel -m "grep blah {}"

В -m Параметр parallel позволяет загружать как можно больше файлов при каждом вызове grep, что более эффективно, чем просто greping одного файла за раз.

Я понимаю, что проблема в том, что он выбрасывает другие find ошибки помимо проблем с разрешениями. Я подозреваю, что есть способ обойти это с помощью опции поиска -depth но я еще не исследовал это.

Было бы интересно протестировать find / grep vs. grep -r vs. parallel подходит к многоядерной системе и посмотрите, какая из них быстрее.