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

Странно работает скрипт поиска

01.06.2016, 23:23. Показов 1735. Ответов 16

Студворк — интернет-сервис помощи студентам
Добрый день, помогите пожалуйста разобраться с проблемой.
Пишу скрипт который должен искать в списке каталогов файлы с определенными масками в которых есть определенный тест, сортировать и записывать в файл. Вот такой скрипт у меня получается.
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
echo "Directories"
read a
echo "Masks"
read b
echo "Phrase"
read c
echo "File"
read d
for DIR in $a/*
do
for MASK in $b
do
find $DIR -name $MASK | xargs grep -li "$c" | sort >> $d
done
done
echo "Read file?"
until false
do
read x
case $x in
y|Y) cat $d; break;;
n|N) echo OK; break;;
*) echo Problems
esac
done
при запуске скрипта задаю директории к примеру folder1 folder2, маски *.txt *.doc и поисковую фразу hello ну и указываю файл в который будут записаны результаты. Все отлично работает, НО проблема заключается в следующем, если в директории в которой лежит скрипт есть файл с маской *.txt то он уже не найдет эти файлы в заданных директориях, а найдет только *.doc Как можно решить эту проблему, подскажите пожалуйста?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.06.2016, 23:23
Ответы с готовыми решениями:

Скрипт поиска в папке
С башем я вообще не разу не работал. Мне нужен скрипт .sh который бы искал в папке определенный файл и если он есть выводил одно...

Скрипт поиска совпадений в строке
Добрый день. В написание скриптов на bash не силен, но учусь. Прошу помочь. Имеется файл формата XML, этот файл содержит разные строки,...

Скрипт поиска файлов по заданному критерию
Как написать скрипт, осуществляющий поиск файлов по заданному пользователем критерию (имя файла, тип файла, размер файла, дата и время...

16
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
02.06.2016, 00:17
Когда Вы подставляете $b в 11 строке, то BASH выполняет подстановку — меняет «*.txt» на именa файлов. Попробуйте
Bash
9
grep -ilr "$c" $(sed 's/\S\+/--include="&"/g' <<<$b) $a | sort >> "$d"
1
74 / 74 / 17
Регистрация: 06.05.2016
Сообщений: 413
02.06.2016, 00:48
упс...
0
0 / 0 / 0
Регистрация: 01.06.2016
Сообщений: 8
04.06.2016, 12:04  [ТС]
Попробовал сделать так, что-то вообще ничего не нашло
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
04.06.2016, 17:45
Лучший ответ Сообщение было отмечено Hagalazved как решение

Решение

Bash
9
sed 's/\S\+/--include="&"/g' <<<$b | xargs grep -ilr "$c" $a | sort >> "$d"
1
0 / 0 / 0
Регистрация: 01.06.2016
Сообщений: 8
05.06.2016, 17:27  [ТС]
Хотел еще уточнить один момент когда в переменную $a мы через пробел вводит слова это получается как массив? Я просто читал следующее "Одна команда "read" может прочитать (присвоить) значения сразу для нескольких переменных. Если переменных в "read" больше, чем их введено (через пробелы), оставшимся присваивается пустая строка. Если передаваемых значений больше, чем переменных в команде "read", то лишние игнорируются." По логике должна была ввестись только первая директория, а остальные проигнорироваться. Но скрипт принимает все директории и все работает. Немного не могу понять этот момент.

Добавлено через 58 минут
Точнее с подстановкой директорий понятно, а вот с подстановкой масок не очень. Там получается $b='*.txt *.doc' к примеру. Если это подставить в старую строку
Bash
1
find $DIR -name *.txt *.doc | xargs grep -li "$c" | sort >> $d
то работать не будет, но с FOR работало и непонятен этот момент каким образом подставляются значение переменной в -name в команде find.
0
74 / 74 / 17
Регистрация: 06.05.2016
Сообщений: 413
05.06.2016, 19:33
Bash
1
man find | sed -n '/NON-BUGS/,/BUGS/p'
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
05.06.2016, 20:26
Hagalazved, нет не массив. Для массива надо указать соответствующую опцию -a, а стандартно в переменную читается остаток строки: т.е. для например 2-х переменных и вводимых 3-х значений 1-е значение присвоится 1-й переменной, а строка из 2 и 3 значения — 2-й переменной.
Что касается масок, то FOR читает из передаваемой строки по 1 значению, разделенных параметром IFS, который по умолчанию равен пробелу, переводу строки и табуляции (любому из трех). В find должно быть передано 1 значение.
0
0 / 0 / 0
Регистрация: 01.06.2016
Сообщений: 8
06.06.2016, 11:21  [ТС]
Я так понимаю <<< работает только в bash, потому что у меня на работе стоит KornShell и интерпритатор ругается /bin/ksh: syntax error: `<' unexpected
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
06.06.2016, 16:20
<<<$b == echo $b |
0
0 / 0 / 0
Регистрация: 01.06.2016
Сообщений: 8
06.06.2016, 20:53  [ТС]
А в этом случае пишет ошибку "sed: невозможно прочитать echo: No such file or directory" я еще по другому пробовал, так делал `echo $b` и в файл пытался занести переменную, а потом файл подставлял в sed все равно не работает, там правда немного другие ошибки писал

Добавлено через 1 час 30 минут
А еще пытался понять, но что-то до меня не сильно доходит. Почему именно мы ищем \S\+ и заменяем на --include="&" зачем вообще include нужен и почему именно S+ можете объяснить если не сложно?
0
74 / 74 / 17
Регистрация: 06.05.2016
Сообщений: 413
06.06.2016, 21:24
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
21:10( IFS=$IFS_DEFAULT)
->read b
1 2 3
21:10( read b)
->echo $b
1 2 3
21:10( echo $b)
->sed 's/\S\+/--include="&"/g' <<<$b
--include="1" --include="2" --include="3"
21:10( sed 's/\S\+/--include="&"/g' <<<$b)
->echo $b | sed 's/\S\+/--include="&"/g' 
--include="1" --include="2" --include="3"
21:14( echo $b )
->ksh
$ read b
1 2 3
$ echo $b
1 2 3
$ sed 's/\S\+/--include="&"/g' <<<$b
--include="1" --include="2" --include="3"
$ echo $b | sed 's/\S\+/--include="&"/g'
--include="1" --include="2" --include="3"
А про sed/awk, вообще, можно отдельные темы создавать.
0
0 / 0 / 0
Регистрация: 01.06.2016
Сообщений: 8
06.06.2016, 23:22  [ТС]
Спасибо, в этом я уже всем разобрался, осталась только одна "магия" для меня, почему именно \S\+ в шаблоне поиска указывается. Это какие-то управляющие символы что ли, только я не могу найти что они значат.
0
74 / 74 / 17
Регистрация: 06.05.2016
Сообщений: 413
06.06.2016, 23:52
http://emulek.github.io/sed/ch02.html#id2513389
0
0 / 0 / 0
Регистрация: 01.06.2016
Сообщений: 8
06.06.2016, 23:58  [ТС]
Спасибо
0
74 / 74 / 17
Регистрация: 06.05.2016
Сообщений: 413
07.06.2016, 00:01
Косяк. Отвечал на вопрос, что такое "\S" в sed.
Я не увидел в теме, где в шаблоне поиска указывается "\S" или "\S\+".
0
0 / 0 / 0
Регистрация: 01.06.2016
Сообщений: 8
07.06.2016, 09:21  [ТС]
Во теперь новый косяк, в KornShell походу не работает --include для греп и ищет скприпт не учитывая маски а во всех файлах в директориях

Добавлено через 7 минут
Или даже регулярные выражения не принимает, потому что при выполнении
Bash
1
echo "$b" | sed 's/\S\+/--include="&"/g'
в результате пишет *.txt *.doc вместо --include="*.txt" --include="*.doc"

Добавлено через 12 минут
Сделал такого вида
Bash
1
sed 's/[^ ]*/--include="&"/g'
начало изменять строку, но греп все равно ищет во всех подряд файлах. А не только в тех которые соответствуют маске
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2016, 09:21
Помогаю со студенческими работами здесь

Скрипт поиска и замены текста в файле
Всем привет! Помогите пожалуйста написать простой скрипт по поиску и замены текста в файле. Есть текст такого вида: Как видно...

Написать скрипт поиска файлов в подпапках разными подпроцессами
Всем привет. Помогите, пожалуйста, с решением задачи, ибо надо срочно сделать, а я в bash не осень разбираюсь Задача такая:

Написать скрипт поиска одинаковых по их содержимому файлов в двух каталогах
Пользователь задаѐт имена Dir1 и Dir2 в качестве первого и второго аргумента командной строки. В результате работы файлы, имеющиеся в...

Скрипт поиска слов в любых файлах, в т.ч. docx, doc, xlsx, xls
#!/bin/sh ######################################################################################################################## #...

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru