Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: найти в выводе команды find?  (Прочитано 1794 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн prestonia

  • Автор темы
  • Активист
  • *
  • Сообщений: 487
    • Просмотр профиля
найти в выводе команды find?
« : 29 Апреля 2015, 22:29:30 »
чтото туплю... да и честно говоря не особо разбираюсь в комбинациях команд

требуется - найти по диску от корня все файлы с именем text.txt из всех подкаталогов, потом вывести только те имена и пути, которые содержат в себе строку "str1" (в общем вывести в том виде, как возвращает grep при поиске по множеству файлов)
вот чтото дальше не понимаю...
find-ом можно получить список имен файлов, удовлетворяющих шаблону...
а как дальше открыть каждый из них, и выдать только те, в которых есть str1 (включая саму строка, str1-содержащую)?
желательно без циклов-переменных и прочего сиплюсплюса

Пользователь решил продолжить мысль 29 Апреля 2015, 22:45:41:
для наглядности добавлю, что нужно получить

maestro@meniac:~$ набор_команд
/путь1/text.txt:блабла str1 блабла
/путь1/путь2/text.txt: блабла str1 бла
/путь1/путь2/text.txt: str1 бла
/путь1/путь2/путь3/text.txt:бла str1 блабла бла
и т.д.
« Последнее редактирование: 29 Апреля 2015, 22:45:41 от prestonia »

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: найти в выводе команды find?
« Ответ #1 : 29 Апреля 2015, 22:55:52 »
grep -riw "str1" /path/to_root/folder | grep "test.txt"
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн prestonia

  • Автор темы
  • Активист
  • *
  • Сообщений: 487
    • Просмотр профиля
Re: найти в выводе команды find?
« Ответ #2 : 29 Апреля 2015, 23:07:05 »
grep -riw "str1" /path/to_root/folder | grep "test.txt"

но не совсем то - это будет "молотилка" поиском сначала по ВСЕМ файлам, а надо сначала найти файлы по имени, а потом уже отобрать те, в которых есть нужный текст

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: найти в выводе команды find?
« Ответ #3 : 29 Апреля 2015, 23:50:50 »
"Вам шашечки или ехать?" (с)
find /path -type f -name "text.txt" > /path/to/results && for i in `cat /path/to/results`; do echo "$i" && grep "str1" -iw "$i"; doneПримерно так. Возможно, налажал с синтаксисом, проверять не стал.

UPD: Поправил, проверил. Работает.
« Последнее редактирование: 30 Апреля 2015, 00:02:29 от Protopopulus »
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: найти в выводе команды find?
« Ответ #4 : 30 Апреля 2015, 00:00:33 »
Код: (bash) [Выделить]
find /path1 -type f -name "text.txt" -exec grep "str1" {} +
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: найти в выводе команды find?
« Ответ #5 : 30 Апреля 2015, 00:03:41 »
Azure, кстати да!.. Что-то я и забыл про -exec :idiot2:
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн Grrrrrow

  • Активист
  • *
  • Сообщений: 321
    • Просмотр профиля
Re: найти в выводе команды find?
« Ответ #6 : 30 Апреля 2015, 00:22:15 »
Azure,
А как указать чтобы find искал не все файлы подряд, а только текстовые? (в любой кодировке) т.е те которые можно прочесть в текстовом редакторе.
И как можно указать папки в которых не нужно выполнять поиск?
Спасибо.

Оффлайн prestonia

  • Автор темы
  • Активист
  • *
  • Сообщений: 487
    • Просмотр профиля
Re: найти в выводе команды find?
« Ответ #7 : 30 Апреля 2015, 00:28:31 »
Код: (bash) [Выделить]
find /path1 -type f -name "text.txt" -exec grep "str1" {} +

у меня прямо синтаксический оргазм :D

спасибо большое, работает идеально!  :coolsmiley:

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: найти в выводе команды find?
« Ответ #8 : 30 Апреля 2015, 01:25:14 »
Grrrrrow,
  • find больше относится к файловой системе, чем к содержанию файлов, так что без привлечения дополнительных команд скорее всего никак.
  • ! -path '*имя_папки*' (а лучше приведите пример)
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Grrrrrow

  • Активист
  • *
  • Сообщений: 321
    • Просмотр профиля
Re: найти в выводе команды find?
« Ответ #9 : 30 Апреля 2015, 01:32:28 »
Azure,

1 Какой программой это можно сделать?
2 Просто например исключить папки proc dev при поиске от корня.

Так?
find / ! -path "/proc" ! -path "/dev" -name "шаблон_для_поиска"
« Последнее редактирование: 30 Апреля 2015, 01:42:56 от Grrrrrow »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: найти в выводе команды find?
« Ответ #10 : 30 Апреля 2015, 12:26:08 »
Grrrrrow,
  • Например:
        file --mime-type * | grep -Po ".*(?=:\s+text/)"
  • -path относится ко всему пути, так что я добавил бы *"/proc*"
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: найти в выводе команды find?
« Ответ #11 : 30 Апреля 2015, 12:33:45 »
grep -rs "str1" /папка
Wars ~.o

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: найти в выводе команды find?
« Ответ #12 : 30 Апреля 2015, 15:18:42 »
victor00000,
Только для **text.txt ;)
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: найти в выводе команды find?
« Ответ #13 : 30 Апреля 2015, 16:20:11 »
find /papka -rype f -name "*.txt" | xargs -I {} grep -rs "str1" {}
Wars ~.o

Оффлайн Grrrrrow

  • Активист
  • *
  • Сообщений: 321
    • Просмотр профиля
Re: найти в выводе команды find?
« Ответ #14 : 01 Мая 2015, 00:03:44 »
Еще раз: цель - рекурсивно найти только текстоые файлы в директории.

Azure,
1
Цитировать
file --mime-type * | grep -Po ".*(?=:\s+text/)"
Не работет.

2 Работает)) спасибо.

victor00000,
Цитировать
grep -rs "str1" /папка
Не то.

Цитировать
find /papka -rype f -name "*.txt" | xargs -I {} grep -rs "str1" {}
* -type
Тоже.

 

Страница сгенерирована за 0.017 секунд. Запросов: 19.