Найти файл
От: Аноним  
Дата: 12.11.12 11:18
Оценка:
Как найти файл по маске, начиная с корня, содежащий определенный текст?
Re: Найти файл
От: watch-maker  
Дата: 12.11.12 11:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как найти файл по маске, начиная с корня, содежащий определенный текст?


В find передаешь маску, в grep — текст:
find / -name '*.txt' -print0 | xargs -0 grep -l 'Hello, World!'
Re[2]: Найти файл
От: zaufi Земля  
Дата: 12.11.12 18:28
Оценка:
Здравствуйте, watch-maker, Вы писали:

WM>Здравствуйте, Аноним, Вы писали:


А>>Как найти файл по маске, начиная с корня, содежащий определенный текст?


WM>В find передаешь маску, в grep — текст:

WM>
find / -name '*.txt' -print0 | xargs -0 grep -l 'Hello, World!'


я бы делал так:
find . -type f -name '*.*' -exec grep -l 'Hello, World!' {} +


+ меньше fork/exec -- быстрее работаем т.к. не нужно запускать xarg, который в свою очередь будет запускать grep на *каждый* файл. кроме того, find, в этом случае, запускает grep вообще 1 раз просто передавая ему кучу файлов найденных...
+ ошибкоустойчивей -- может случиться странное если обнаружится каталог или fifo, а может даже и устройство подходящее по маске
+ короче писать
Re[3]: Найти файл
От: watch-maker  
Дата: 12.11.12 21:08
Оценка: +1
Здравствуйте, zaufi, Вы писали:


WM>>В find передаешь маску, в grep — текст:

WM>>
find / -name '*.txt' -print0 | xargs -0 grep -l 'Hello, World!'


Z>я бы делал так:

Z>
Z>find . -type f -name '*.*' -exec grep -l 'Hello, World!' {} +
Z>


Z>+ меньше fork/exec -- быстрее работаем т.к. не нужно запускать xarg, который в свою очередь будет запускать grep на *каждый* файл.

Не на каждый файл, а на столько файлов, сколько вместится в командную строку. Поведение тут точно такое же как и для '{} +' для find. В man find об этом, кстати говоря, прямо так и сказано:

-exec command {} +
...
The command line is built in much the same way that xargs builds its command lines.

Z>кроме того, find, в этом случае, запускает grep вообще 1 раз просто передавая ему кучу файлов найденных...
Не один раз. Смотри выше. Ограничение на длину строки всё тоже.

Z>+ ошибкоустойчивей -- может случиться странное если обнаружится каталог или fifo, а может даже и устройство подходящее по маске

-type f полезно писать, да.

Z>+ короче писать


Ну если уж заговорили о скорости, то в xargs есть ключ -P0, с которым процесс вполне себе существенно ускоряется. Особенно, если на машине несколько дисков. Такое через find просто уже не сделаешь.
Или не 0, но другая разумная константа. Плюс даже искусственно можно поднять частоту вызова grep (задав -n200, например). Да, это увеличит число fork/exec, но также поднимет скорость поиска. Тут просто число fork/exec не очень хорошая метрика. Ясно только, что это значение не должно быть слишком большим. Но опрометчиво судить о производительности способов, у которых оно равно, условно говоря, 2 и 10, только по нему.
А так, навернуть ещё можно много всего. Заменить find на locate, например. Или собственную утилиту написать. Только это всё преждевременная оптимизация какая-то.
Re: Найти файл
От: ДимДимыч Украина http://klug.org.ua
Дата: 14.11.12 12:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как найти файл по маске, начиная с корня, содежащий определенный текст?


Можно и с помощью одного grep:
$ grep -lr -D skip --include 'pattern' /

Но эксперимент показывает, что работает дольше, чем с помощью find.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.