Когда я звоню
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
подходит к многоядерной системе и посмотрите, какая из них быстрее.