каталог/подкаталог (поиск)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

andreevich
Сообщения: 2

каталог/подкаталог

Сообщение andreevich »

Пытаюсь начать изучение...
и вот тупик. Банальный поиск файлов по содержимому

Код: Выделить всё

$searhword=word
for file in *
do
if grep -q $searhword $file
  then
    echo "-> $file"
 fi
done


на удивление всё работает, но, как оказалось, поиск осуществляется ТОЛЬКО в текущем каталоге и игнорируются напрочь файлы в подкаталогах данной директории.
Погуглив, выяснилось, что есть такая связка

Код: Выделить всё

find . -name "word"


но тут ищет ' word ' в названии, но зато и в подкаталогах.

Подскажите, пожалуйста, как добиться желаемой цели (поиск по СОДЕРЖИМОМУ по всему каталогу, с учётом подкаталогов)
Спасибо .
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: каталог/подкаталог

Сообщение sash-kan »

$ grep -r 'что ищем' /где/ищем
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
andreevich
Сообщения: 2

Re: каталог/подкаталог

Сообщение andreevich »

sash-kan писал(а):
08.11.2009 18:56
$ grep -r 'что ищем' /где/ищем


Эт что получается, из-за одного параметра -r всё поменялось?
спасибо!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: каталог/подкаталог

Сообщение drBatty »

andreevich писал(а):
08.11.2009 19:04
Эт что получается, из-за одного параметра -r всё поменялось?

можно и не так
grep 'что ищем' /где/ищем/**/*
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: каталог/подкаталог

Сообщение t.t »

drBatty писал(а):
05.03.2010 18:44
andreevich писал(а):
08.11.2009 19:04
Эт что получается, из-за одного параметра -r всё поменялось?
можно и не так
grep 'что ищем' /где/ищем/**/*
Хм..

Shell

t:~$ ls -d /etc/**/* | wc -l 604 t:~$ ls -d /etc/*/* | wc -l 604 t:~$ find /etc 2>/dev/null | wc -l 1366 t:~$ echo $SHELL /bin/bash
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: каталог/подкаталог

Сообщение drBatty »

t.t писал(а):
07.03.2010 10:47
grep 'что ищем' /где/ищем/**/*

Хм..

а причём тут ls, find? я про grep писал:

Shell

$ grep "http" /etc/**/* 2>/dev/null | wc -l 962 $ grep "http" /etc/* 2>/dev/null | wc -l 191 $ grep -r "http" /etc/* 2>/dev/null | wc -l 1438 $ find /etc -exec grep "http" {} 2>/dev/null \; | wc -l 1438 $ find /etc -maxdepth 1 -exec grep "http" {} 2>/dev/null \; | wc -l 191 $ find /etc -maxdepth 2 -exec grep "http" {} 2>/dev/null \; | wc -l 1153

upd:
получается, что ** - второй уровень
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: каталог/подкаталог

Сообщение watashiwa_daredeska »

'**' работает в bash после shopt -s extglob
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: каталог/подкаталог

Сообщение t.t »

drBatty писал(а):
07.03.2010 10:51
а причём тут ls, find? я про grep писал:

Shell

$ grep "http" /etc/**/* 2>/dev/null | wc -l 962 $ grep "http" /etc/* 2>/dev/null | wc -l 191 $ grep -r "http" /etc/* 2>/dev/null | wc -l 1438 $ find /etc -exec grep "http" {} 2>/dev/null \; | wc -l 1438 $ find /etc -maxdepth 1 -exec grep "http" {} 2>/dev/null \; | wc -l 191 $ find /etc -maxdepth 2 -exec grep "http" {} 2>/dev/null \; | wc -l 1153

upd:
получается, что ** - второй уровень
Интересно, откуда эта разница, если подстановка имён производится шеллом _до_ выполнения команды?..

watashiwa_daredeska писал(а):
07.03.2010 11:33
'**' работает в bash после shopt -s extglob
Точно, спасибо за напоминание. В мане не увидел этого.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: каталог/подкаталог

Сообщение drBatty »

grep dir/*
ищет только в файлах в dir
grep dir/**/*
ищет только в файлах, которые в подкаталогах dir/*, например в dir/dir2/t.txt
но не ищет в dir/t.txt, и не ищет в dir/dir2/dir3/t.txt
grep -r dir/*
ищет везде, во всех файлах каталога dir и его подкаталогов.

разница между find -maxdepth 2 и grep ** есть: первая команда находит также файлы в каталоге для поиска.
grep /etc/* /etc/**/* находит ровно столько-же, сколько и find maxdepth 2
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: каталог/подкаталог

Сообщение t.t »

А, нет, "нет никакой разницы", это я что-то попутал. Я имел ввиду разницу между grep */* и grep **/* -- показалось, что она есть, хотя быть её (без shopt -s extglob) не должно. А так всё понятно. Без этой опции две звёздочки равносильны одной, как я и говорил: ведь звёздочка, в терминах shell, это "ноль или больше любых символов".

И поскольку подстановка шаблонов производится шеллом до выполнения команды, то действительно совершенно не важно, что это за команда -- grep или ls.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: