Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 17.10.2017
Сообщений: 2
1

Найти все файлы содержащие в себе свое же имя

17.10.2017, 21:28. Показов 2017. Ответов 4

Author24 — интернет-сервис помощи студентам
Доброго времени суток, господа.

Мне поставили задачу - реализовать поиск текстовых файлов во каталоге и всех подкаталогах, в тексте которых содержится имя самого файла. (Например в файле file1.txt нашлось file1, в abrakadabra.txt - abrakadabra и т.д.)

Есть ли возможность искать одновременно и файлы и проверять их содержимое? Я смутно представляю себе, что нужно использовать grep -r дабы рекурсивно пройтись по всем файлам в каталоге. Но вот искомая фраза все время меняется - как с этим быть? Или я совсем не туда думаю и нужно использовать find. Ведь grep же не ищет в подкаталогах?

Заранее благодарю за помощь. Совсем мозг стёр с этим.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.10.2017, 21:28
Ответы с готовыми решениями:

Как создаются проекты, содержащие в себе разные файлы?
Мне нужно создать файл-проект который будет ассоциироваться с программой и содержащий различные...

Вывести все слова из файла, содержащие в себе слово red
Необходимо вывести все слова из файла, содержащие в себе слово red Вот код: #include...

Найти все файлы с данным разрешением и вывести их имя и размер
эта программа работает и выдает правильный результат, если файлы *.jpg находятся в папке с...

Найти и вывести все файлы имя которых начинается с указанной буквы
Доброго времени суток. Помогите с лабой пож-та. Дан только этот код. Как я понимаю эта программа...

4
Эксперт NIX
2795 / 2038 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
17.10.2017, 21:43 2
Bash
1
find -type f -exec bash -c 'fname=$(basename $0) ; grep -Il "${fname%.*}" $0' {} \;
2
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
17.10.2017, 21:50 3
grep может искать в подкаталогах (опция -r), но в данном случае, действительно, всё время меняется искомая строка. Почему не вызывать grep отдельно для каждого найденного файла? В баше искать файлы можно find-ом, но вряд ли получится короче, чем в zsh:
Bash
1
for f (**/*(.D)) grep -Il ${f:t} $f
  • for ... (...) ... ― короткая форма for для однострочников
  • ** ― рекурсивный глоб для текущей директории и поддиректорий
  • (.D) ― точка значит, что искать только регулярные файлы, а D ― что включать и скрытые файлы
  • ${f:t} ― взять только последнюю компоненту имени файла f (то есть если f имеет значение foo/bar/baz, то ${f:t} раскрывается в baz), это имя файла, которое ищем grep-ом
  • $f ― при раскрытии переменных в zsh можно не писать кавычки
2
0 / 0 / 0
Регистрация: 17.10.2017
Сообщений: 2
17.10.2017, 23:32  [ТС] 4
Прошу прощения за надоедливость, но хочется все-таки понять что происходит в написаном Вами коде. Я не из тех, кому нужно gimme da codes. Мне правда интересно понять принцип.

Что я понял:
find -type f - искать только обычные файлы
exec bash - выполнить скрипт записаный в строке после -c
fname=$(basename $0) - вот тут если можно поподробнее. Интуитивно понимаю, что fname присваивается имя файла, но как это работает? Применяется на каждый файл отдельно?

grep -Il '$fname%.*" '$0' {} - Вообще ничего неясно, кроме очевидных параметров для грепа.

Заранее благодарен за ответ.
0
Эксперт NIX
2795 / 2038 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
18.10.2017, 15:57 5
А самому?
Цитата Сообщение от man bash
Код
-c     If the -c option is present, then commands are read from the first non-option argument command_string.  If
       there are arguments after the command_string, the first argument is assigned to $0 and any remaining argu‐
       ments are assigned to the positional parameters.  The assignment to $0 sets the name of the  shell,  which
       is used in warning and error messages.
…
${parameter%word}
${parameter%%word}
       Remove matching suffix pattern.  The word is expanded to produce a pattern just as in pathname expansion.  If
       the  pattern  matches a trailing portion of the expanded value of parameter, then the result of the expansion
       is the expanded value of parameter with the shortest matching pattern (the ``%'' case) or the longest  match‐
       ing  pattern  (the ``%%'' case) deleted.  If parameter is @ or *, the pattern removal operation is applied to
       each positional parameter in turn, and the expansion is the resultant list.  If parameter is an  array  vari‐
       able  subscripted  with @ or *, the pattern removal operation is applied to each member of the array in turn,
       and the expansion is the resultant list.
0
18.10.2017, 15:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2017, 15:57
Помогаю со студенческими работами здесь

Найти первые 20 слов из текста, содержащие в себе введённое слово
Дан большой текст в виде текстового файла, например, роман Толстого Л.Н. «Война и мир»....

Скрипт, получающий от пользователя имя приложения, должен найти в каталоге и подкаталогах все файлы
1. Напишите скрипт, подсчитывающий количество скрытых подкаталогов в домашнем каталоге...

Во втором каталоге которой указан в переменной PATH найти все файлы содержащие в названии букву "b"
Здравствуйте, поставлена такая задача: "Во втором каталоге которой указан в переменной PATH найти...

Ввести фамилию, имя, отчество. Вывести свое имя в столбик
Ввести фамилию, имя, отчество. Вывести свое имя в столбик.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru