Есть желание сделать поиск по домашней директории например при помощи команды:grep 'что то что надо найти' "$HOME" -r -R
так чтобы по всем каталогам и симлинкам походил, только вот знаю что на каталоги proc и sys лучше grep не натравливать, иначе либо всё закончится потенциально бесконечно долгим поиском с перспективой самых непредсказуемых последствий (некоторые из интернета систему ложили так).
Я уверен, что в эти каталоги ведут ссылки из домашней директории (как минимум через .wine в которм есть ссылка на корень).
Можно ли как-то запретить grep'у заходить в proc и sys но при этом сохранить ключ -R (который разрешает ходить grep'у по ссылкам).?
> Есть желание сделать поиск по домашней директории ...Можно постараться оставаться в пределах одной и той-же файловой системы.
Люди комбинируют grep с find, т.к. grep сам файловые системы друг от друга не отличает.https://unix.stackexchange.com/questions/16138/how-to-search...
grep -i -r --exclude-dir="/proc" --exclude-dir="/sys" 'my_search_phrase' .
> 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.
Тогда лучше findfind / -name "searching_phrase" \( ! -name /proc \) -o \( ! -name /sys \) -print
> Тогда лучше 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’?
Хотя должен был по идее все файлы из моего каталога показать.
find / -mount -type f | xargs grep "searching phrase"Он ещё и в tmpfs не полезет.
Попробовал: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 не сложносочинённый, то можно его звать прямо из find, ключём -exec.
> Кстати, а что должно было запретить ему лазить в sys и proc?
Ключ -xdev.
find "/media/i/Tmp/ScriptTestingPOLYGON" -mount -type f -print0 | xargs -0 grep "*"Вот так нормально будет искать даже если в именах директорий или файлов есть пробелы.
> Вот так нормально будет искать даже если в именах директорий или файлов
> есть пробелы.Ты огрёб ещё один шаг к силе, о юный падаван!
Ты молодец, продолжай в том же направлении.
> find "/media/i/Tmp/ScriptTestingPOLYGON" -mount -type f -print0 | xargs -0 grep "*"
> Вот так нормально будет искать даже если в именах директорий или файлов
> есть пробелы.С передачей результатов от find в grep теперь всё действительно ok, только вот эта строка ничего не находит, но это уже какие-то интересности с восприятием grep'ом шаблона "*" потому что если заменить это на "1" например, то он уже много чего находит.
PS: Думаю ключи -mount (-xdev) -type f - не нужны. Я не хочу запрещать ему ходить по ссылкам и другим файловым системам. Только в proc и sys путь надо закрыть.
тогда + xarg
> 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 показывать все места, в которых он сейчас ищет?
Впринципе если ему сказать "ищи всё" то он будет показывать всё что видет (кроме пустых каталогов скорее всего)
Но вот что ему в качестве шаблона для поиска передать, чтобы это означало "искать всё" ведь * почему-то не работает.
Попробовал передать *?* - вроде всё подряд показывает - это правильный вариант, чтобы вывести ВСЁ? Хотя по моему так он пустые файлы не покажет, потому что ? - означает, что один символ всё таки должен быть.
Хочу посмотреть на чём он стопорится. Ещё ни разу поиск по корню не завершился нормально, пробовал давать ему целые сутки висеть - всё равно не закончился.