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


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Не могу соединить find и grep  (Прочитано 982 раз)

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

Оффлайн neman2024

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Не могу соединить find и grep
« : 11 Октября 2024, 08:29:34 »
Доброго времени суток
Вроде бы простая задача, но уже несколько дней бьюсь, маны, наверное десятки сайтов - не могу понять, как делать. На многих сайтах сказано, что такое работает, у меня почему-то нет:
1. Просто отбираем с помощью find файлы .txt:
find /home/dimi -name "*.txt"
/home/dimi/mysoft.txt
/home/dimi/222.txt
/home/dimi/proba.txt
/home/dimi/Proba2/proba_sudo.txt
/home/dimi/Proba2/Proba/Prov10.txt
/home/dimi/file.txt
/home/dimi/123.txt
/home/dimi/color.txt
/home/dimi/Proba/Prov10.txt
/home/dimi/proverka.txt
/home/dimi/Proba3/321.txt
/home/dimi/235.txt
/home/dimi/анекдот.txt

2. Пробую передать эти файлы в grep, чтобы уже искать слово "proba" в найденном (причем не только в названии, но уже и в содержимом найденных файлов):
find /home/dimi -name "*.txt" -exec grep -i proba {} \;
node-aproba/noble 2.0.0-3 all
probabel-examples/noble 0.5.0+dfsg-6 all
probabel/noble 0.5.0+dfsg-6 amd64
probalign/noble 1.4-10 amd64
Proba
Proba
Proba
proba
те. уже какая хрень, grep обрабатывает не результат find, а что-то совсем другое. Хотя бы потому, что найдены не все файлы, внутри которых есть "proba"

3. И на закуску: везде сказано, что в при использовании -exec "\;" тоже самое, что и "+". Пробую:
find /home/dimi -name "*.txt" -exec grep -i proba {} +
/home/dimi/mysoft.txt:node-aproba/noble 2.0.0-3 all
/home/dimi/mysoft.txt:probabel-examples/noble 0.5.0+dfsg-6 all
/home/dimi/mysoft.txt:probabel/noble 0.5.0+dfsg-6 amd64
/home/dimi/mysoft.txt:probalign/noble 1.4-10 amd64
/home/dimi/222.txt:Proba
/home/dimi/proba.txt:Proba
/home/dimi/proverka.txt:Proba
/home/dimi/Proba3/321.txt:proba

Т.е. получаем уже третий результат...
Подскажите, пожалуйста, в чем причина?
« Последнее редактирование: 11 Октября 2024, 08:43:35 от neman2024 »

Оффлайн Usermaster

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 3320
    • Просмотр профиля
Re: Не могу соединить find и grep
« Ответ #1 : 11 Октября 2024, 10:33:46 »
Почитай что такое конвеер. Передача вывода одной команды другой осуществляется чере |

Не подойдёт?
find ./ -iname "*.txt" | grep -i "Proba"Или сразу так
find ./ -iname "*Proba*"
А чего это вы тут делаете, а?

Оффлайн neman2024

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Не могу соединить find и grep
« Ответ #2 : 11 Октября 2024, 11:12:45 »

Пользователь добавил сообщение 11 Октября 2024, 11:14:16:
Почитай что такое конвеер. Передача вывода одной команды другой осуществляется чере |
Спасибо за ответ
Я конвейерами часто пользуюсь, здесь просто немного другая ситуация: отобранные с помощью grep файлы надо скопировать в отдельную директорию. Как мне на одном форуме написали, что это возможно только если команды соединять через -exec, а не через |. Но никаких деталей не написали, отправили читать man)
Если идти через конвейер - файлы отбираются, но не могу их скопировать, выдается ошибка, а если через -exec - там вообще не понятно что на выходе получаем...
Через | xargs cp тоже не работает...
« Последнее редактирование: 11 Октября 2024, 11:18:07 от neman2024 »

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7810
  • We were here
    • Просмотр профиля
Re: Не могу соединить find и grep
« Ответ #3 : 11 Октября 2024, 12:25:51 »
отобранные с помощью grep файлы надо скопировать в отдельную директорию
Вот с этого и надо начинать.

find /home/dimi -name "*.txt" -exec grep -li proba {} \; | xargs -I{} cp {} /folder/path/to/copy
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 11 Октября 2024, 12:51:45 от ALiEN »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн neman2024

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Не могу соединить find и grep
« Ответ #4 : 11 Октября 2024, 13:03:15 »
Спасибо огромное, так заработало)
Есть один момент: в разных папках есть файлы с одинаковыми названиями, и при таком варианте команды они перезаписываются. Как можно скопировать и структуру каталогов? Попытка cp -r ничего не дает: файлы по прежнему копируются без каталогов

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7810
  • We were here
    • Просмотр профиля
Re: Не могу соединить find и grep
« Ответ #5 : 11 Октября 2024, 13:49:07 »
скопировать и структуру каталогов?
mkdir /home/dimi/DEST
rsync -r /home/dimi /home/dimi/DEST --files-from=<(find /home/dimi -name "*.txt" -exec grep -li proba {} \;)
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн neman2024

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Не могу соединить find и grep
« Ответ #6 : 11 Октября 2024, 14:18:31 »
Еще раз спасибо

Оффлайн neman2024

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Не могу соединить find и grep
« Ответ #7 : 12 Октября 2024, 16:33:38 »
У меня (наверное, не только у меня) такой вопрос возник:
Хочется понять именно системные закономерности построение таких цепочек команд. Я прочитал много теории, и думал, что все получится, вроде же все делал по инструкции. Почему тогда вариант решения через запуск с помощью конвейера команды -ср не сработал? и через -exec тоже не сработал? И я был на форумах, где писали, что конструкция || ср или || xargs cp должна работать, и у не которых она работала, а у некоторых (и у меня в том числе) - нет, а заработало только через cpio?
Предложенный здесь вариант, безусловно рабочий, но он совершенно нестандартный, почему не работает то, что, по идее должно работать?
Как тогда прогнозировать создание новых сложный команд, если они работают или не работают по по каким-то не понятным причинам?
Это же не дело, каждый раз писать на форум, хочется понять логику и делать самому

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7810
  • We were here
    • Просмотр профиля
Re: Не могу соединить find и grep
« Ответ #8 : 12 Октября 2024, 17:00:05 »
почему не работает то, что, по идее должно работать?
Что конкретно не работает? Выше под спойлером я вроде объяснил работу приведенных вами команд.

конструкция || ср или || xargs cp должна работать, и у не которых она работала, а у некоторых (и у меня в том числе) - нет, а заработало только через cpio?
|| и | - разные вещи. И откуда еще cpio какое-то взялось?

вариант, безусловно рабочий, но он совершенно нестандартный,
и в чём же заключается "нестандартность"?
« Последнее редактирование: 12 Октября 2024, 17:05:18 от ALiEN »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн neman2024

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Не могу соединить find и grep
« Ответ #9 : 12 Октября 2024, 22:36:25 »
|| и | - разные вещи.
Спасибо, что ответили
Сразу приношу извинения - насчет || действительно опечатался, | конечно же.
Выше под спойлером я вроде объяснил работу приведенных вами команд.
В мобильном браузере просто не видно было, что это спойлер, на который можно было нажать, еще раз мои извинения за невнимательность.
Нестандартное - это вариант решения задачи про копирование файлов с помощью cp, Ваш вариант прекрасно сработал, но там через rsync. Я, естественно, не против этого, мне просто надо понять, где либо я косячу с ср, либо с ее помощью вопрос не решается, и надо rsync, или разобраться, в чем я не прав.
Там же есть параметр -r который должен копировать структуру каталогов, но почему не работает?
Я пробовал вариантов 10, наверное, например - вот так:
find /home/dimi -name "*.txt" -exec grep -li proba {} \; | xargs -I{} cp -r {} /folder/path/to/copy
И откуда еще cpio какое-то взялось?
Что касается cpio - один раз для Ubuntu эту идею мне подсказали на каком-то ненашенском форуме, дальше сам уже ее примотал:
find /home/dimi -iname "*.txt" | grep -i proba | cpio -pmud /folder/path/to/copyВот эта комбинация решила все вопросы, и дерево каталогов тоже создала
А меня стал мучить вопрос: почему это не смогла в такой связке сделать cp, хотя ведь должна была!
Извините за душность
« Последнее редактирование: 12 Октября 2024, 23:05:39 от neman2024 »

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7810
  • We were here
    • Просмотр профиля
Re: Не могу соединить find и grep
« Ответ #10 : 12 Октября 2024, 23:26:42 »
-r который должен копировать структуру каталогов, но почему не работает?
копирует, но только если в источнике указан каталог. На выходе у find - файлы. Если на входе у cp файлы, параметр -r не нужен. Обратите внимание, в Ответе#3 я не указываю -r.

rsync в данном примере можно рассматривать как очень продвинутую команду cp. (Но стоит понимать, что cp и rsync - совершенно разные утилиты, с разными подходами к задачам)
В примере выше rsync'ом с ключом -r полностью синхронизируются каталоги, но опцией --files-from ограничиваем действие только заданными файлами.

cpio
Никогда не пользовался. Надо глянуть, что за зверь такой.

Пользователь добавил сообщение 12 Октября 2024, 23:38:11:
а, архиватор. Ну в принципе, тоже решение, хотя на мой взгляд и костыльное.
« Последнее редактирование: 12 Октября 2024, 23:38:11 от ALiEN »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн neman2024

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Не могу соединить find и grep
« Ответ #11 : 13 Октября 2024, 02:44:27 »
копирует, но только если в источнике указан каталог. На выходе у find - файлы. Если на входе у cp файлы, параметр -r не нужен.
Вот этот момент, что следующая после | команда должна обрабатывать только то, что получилось на выходе у предыдушей команды, меня стал сильно смущать. Вот смотрите, простое сочетание на примере find и того же grep:
find /home/dimi -iname "*.txt" | grep -i кимздесь пустой ответ, потому что в указанном каталоге, в результате выдачи find файлов с буквами "ким" не оказалось
но если добавить к grep -r
find /home/dimi -iname "*.txt" | grep -r кимто получаем следующее:
etc/passwd-:dimi:x:1000:1000:[b]Кимур Дм:/home/dimi:/bin/bash
snap/core/17200/usr/lib/systemd/catalog/systemd.ru.catalog:Таким образом, предел
Т.е. | cp -r в такой же ситуации получает на вход результат работы find /home/dimi и работает только с этими данными, поэтому, как Вы написали, -r здесь все равно не нужен, а вот grep -r в точной такой же ситуации работает с файлами всего диска??? И похоже, grepу вообще наплевать, что в выдаче find содержаться только .txt-файлы, он ищет вообще везде. Почему??
У меня уже каша в голове...
« Последнее редактирование: 13 Октября 2024, 03:10:31 от neman2024 »

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7810
  • We were here
    • Просмотр профиля
Re: Не могу соединить find и grep
« Ответ #12 : 13 Октября 2024, 10:35:49 »
grepу вообще наплевать, что в выдаче find содержаться только .txt-файлы, он ищет вообще везде. Почему??
Потому что с ключом -r ему действительно наплевать. Если на вход ничего не подано, уже сам grep прошерстит все директории.
Открываем man grep, смотрим:

        -r, --recursive
              Read all  files  under  each  directory,  recursively,  following
              symbolic  links  only if they are on the command line.  Note that
              if no file operand is given, grep searches the working directory.

              This is equivalent to the -d recurse option.

🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн neman2024

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Не могу соединить find и grep
« Ответ #13 : 13 Октября 2024, 13:14:42 »
Потому что с ключом -r ему действительно наплевать.
Т.е., в Linux все эти операторы, например -r не являются какими-то системными и универсальными для всей системы, они в каждой конкретной команде (даже если по совпадению и отвечают за одно и то же действие, например рекурсивный просмотр директорий) ведут себя по-разному, и каждую команду с ее особенностями надо просто зазубрить?
« Последнее редактирование: 13 Октября 2024, 13:16:31 от neman2024 »

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7810
  • We were here
    • Просмотр профиля
Re: Не могу соединить find и grep
« Ответ #14 : 13 Октября 2024, 14:03:38 »
Конечно, не являются. У утилит разные задачи. Зубрить не надо. Пользуйтесь man
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

 

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