URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID15
Нить номер: 4609
[ Назад ]

Исходное сообщение
"Как запретить grep'у искать в /proc и /sys?"

Отправлено inFlowiaLab , 14-Май-20 00:42 
Есть желание сделать поиск по домашней директории например при помощи команды:
grep 'что то что надо найти' "$HOME" -r -R

так чтобы по всем каталогам и симлинкам походил, только вот знаю что на каталоги proc и sys лучше grep не натравливать, иначе либо всё закончится потенциально бесконечно долгим поиском с перспективой самых непредсказуемых последствий (некоторые из интернета систему ложили так).
Я уверен, что в эти каталоги ведут ссылки из домашней директории (как минимум через .wine в которм есть ссылка на корень).
Можно ли как-то запретить grep'у заходить в proc и sys но при этом сохранить ключ -R (который разрешает ходить grep'у по ссылкам).?

Содержание

Сообщения в этом обсуждении
"Как запретить grep'у искать в /proc и /sys?"
Отправлено Licha Morada , 14-Май-20 03:28 
> Есть желание сделать поиск по домашней директории ...

Можно постараться оставаться в пределах одной и той-же файловой системы.
Люди комбинируют grep с find, т.к. grep сам файловые системы друг от друга не отличает.

https://unix.stackexchange.com/questions/16138/how-to-search...


"Как запретить grep'у искать в /proc и /sys?"
Отправлено Vlad , 14-Май-20 14:02 
grep -i -r --exclude-dir="/proc" --exclude-dir="/sys" 'my_search_phrase' .



"Как запретить grep'у искать в /proc и /sys?"
Отправлено inFlowiaLab , 14-Май-20 18:17 
> grep -i -r --exclude-dir="/proc" --exclude-dir="/sys" 'my_search_phrase' .

Если не указан ключ -R не будет же ходьбы по симлинкам а она мне нужна и ещё одна проблема - исключение директорий почему-то не срабатывает, пробовал вот этой строчкой:

sudo grep -r -R --exclude-dir="/proc" --exclude-dir="/sys" "$s"  "$path" 2>"$errLogPath"

Всё равно ищет и находит в proc и sys.

"Как запретить grep'у искать в /proc и /sys?"
Отправлено Vlad , 15-Май-20 18:24 
Тогда лучше find

find / -name "searching_phrase" \( ! -name /proc \) -o \( ! -name /sys \) -print


"Как запретить grep'у искать в /proc и /sys?"
Отправлено inFlowiaLab , 15-Май-20 20:44 
> Тогда лучше find
> find / -name "searching_phrase" \( ! -name /proc \) -o \( !
> -name /sys \) -print

Не то. Я файлы по содержимому ищу а find же только файлы по имени ищет.
Да и чёт не работает впринципе предложенный вариант команды:


find /media/i/Tmp/ScriptTestingPOLYGON -name "*" \( ! -name /proc \) -o \( ! -name /sys \) -print
find: warning: ‘-name’ matches against basenames only, but the given pattern contains a directory separator (‘/’), thus the expression will evaluate to false all the time.  Did you mean ‘-wholename’?
find: warning: ‘-name’ matches against basenames only, but the given pattern contains a directory separator (‘/’), thus the expression will evaluate to false all the time.  Did you mean ‘-wholename’?

Хотя должен был по идее все файлы из моего каталога показать.

"Как запретить grep'у искать в /proc и /sys?"
Отправлено ACCA , 15-Май-20 22:08 
find / -mount -type f | xargs grep "searching phrase"

Он ещё и в tmpfs не полезет.


"Как запретить grep'у искать в /proc и /sys?"
Отправлено inFlowiaLab , 16-Май-20 17:26 
Попробовал:

find "/media/i/Tmp/ScriptTestingPOLYGON" -mount -type f | xargs grep "*"

вот что выдало:

grep: /media/i/Tmp/ScriptTestingPOLYGON/новый: Нет такого файла или каталога
grep: файл: Нет такого файла или каталога
grep: /media/i/Tmp/ScriptTestingPOLYGON/новый: Нет такого файла или каталога
grep: файл: Нет такого файла или каталога
grep: (копия): Нет такого файла или каталога

Короче говоря он получил пути файлов в незавёрнутом в кавычки виде из за чего воспринял пробелы в имени файлов "новый файл" как разделитель.

Кстати, а что должно было запретить ему лазить в sys и proc?
Ключ "-type f" - мол "смотреть только обычные файлы? или -mount - "не заходить в смонтированные ФС"?
proc и sys - считаются смонтированными?


"Как запретить grep'у искать в /proc и /sys?"
Отправлено Licha Morada , 16-Май-20 22:53 

> Короче говоря он получил пути файлов в незавёрнутом в кавычки виде из
> за чего воспринял пробелы в имени файлов "новый файл" как разделитель.

Да, с пробелами засада. Если grep не сложносочинённый, то можно его звать прямо из find, ключём -exec.

> Кстати, а что должно было запретить ему лазить в sys и proc?

Ключ -xdev.


"Как запретить grep'у искать в /proc и /sys?"
Отправлено 1 , 17-Май-20 03:07 
find "/media/i/Tmp/ScriptTestingPOLYGON" -mount -type f -print0 | xargs -0 grep "*"

Вот так нормально будет искать даже если в именах директорий или файлов есть пробелы.



"Как запретить grep'у искать в /proc и /sys?"
Отправлено ACCA , 17-Май-20 09:44 
> Вот так нормально будет искать даже если в именах директорий или файлов
> есть пробелы.

Ты огрёб ещё один шаг к силе, о юный падаван!
Ты молодец, продолжай в том же направлении.


"Как запретить grep'у искать в /proc и /sys?"
Отправлено inFlowiaLab , 17-Май-20 22:32 
> find "/media/i/Tmp/ScriptTestingPOLYGON" -mount -type f -print0 | xargs -0 grep "*"
> Вот так нормально будет искать даже если в именах директорий или файлов
> есть пробелы.

С передачей результатов от find в grep теперь всё действительно ok, только вот эта строка ничего не находит, но это уже какие-то интересности с восприятием grep'ом шаблона "*" потому что если заменить это на "1" например, то он уже много чего находит.
PS: Думаю ключи -mount (-xdev) -type f - не нужны. Я не хочу запрещать ему ходить по ссылкам и другим файловым системам. Только в proc и sys путь надо закрыть.


"Как запретить grep'у искать в /proc и /sys?"
Отправлено Vlad , 18-Май-20 15:14 
тогда + xarg

"Как запретить grep'у искать в /proc и /sys?"
Отправлено inFlowiaLab , 18-Май-20 11:33 
> grep -i -r --exclude-dir="/proc" --exclude-dir="/sys" 'my_search_phrase' .

Вернулся к этому варианту, он заработал в таком виде:


sudo grep -r -R --exclude-dir="proc" --exclude-dir="sys" "$s"  "$path"

и всё бы хорошо да только вот он отсеивает ВСЕ каталоги по имени proc и sys, а это плохо. Мне то ведь нужно отсеивать только те что лежат в корне. К сожалению вариант предложенный в цитате ("/proc") - не работает, потому что видимо ключ --exclude-dir так не работает. Вот что в мане:
> Skip  any command-line directory with a name suffix that matches the  pattern  GLOB.   When  searching  recursively,   skip   any subdirectory whose base name matches GLOB.  Ignore any redundant trailing slashes in GLOB.

И видимо дело тут конкретно в:
> Ignore any redundant trailing slashes in GLOB.


"Как запретить grep'у искать в /proc и /sys?"
Отправлено inFlowiaLab , 18-Май-20 16:56 
А можно как нибудь заставить grep показывать все места, в которых он сейчас ищет?
Впринципе если ему сказать "ищи всё" то он будет показывать всё что видет (кроме пустых каталогов скорее всего)
Но вот что ему в качестве шаблона для поиска передать, чтобы это означало "искать всё" ведь * почему-то не работает.
Попробовал передать *?* - вроде всё подряд показывает - это правильный вариант, чтобы вывести ВСЁ? Хотя по моему так он пустые файлы не покажет, потому что ? - означает, что один символ всё таки должен быть.
Хочу посмотреть на чём он стопорится. Ещё ни разу поиск по корню не завершился нормально, пробовал давать ему целые сутки висеть - всё равно не закончился.