Проверка файлов на наличие строки с использованием цикла

Проверка файлов на наличие строки с использованием цикла

Я пытаюсь перебрать файлы в каталоге, которые начинаются со строки, указанной в forоператоре. В цикле я хочу найти строку шаблона fooв файле. Если строка найдена в файле, я echoхочу $filename.

#!/ppp/bash

for filename in $(find ~/filesList -type f -name "pge_*")
do
      #If 'foo' located echo $filename
      
done

Любые предложения будут высоко ценится.

решение1

Используйте findдля выполнения grep:

find ~/filesList -type f -name 'pge_*' -exec grep -lF -- foo {} +

-lвыводит список имен файлов, содержащих совпадение с foo. -Fозначает, что выражение fooследует воспринимать как фиксированную строку, а не как регулярное выражение.

решение2

Первое предложение - нет необходимости использовать findв вашем forцикле, это замедляет работу. Вы можете вместо этого сделать что-то вроде:

for f in ~/filesList/pge_*

Довольно важное предостережение заключается в том, что эта упрощенная версия не будет выполнять поиск в подкаталогах, ~/filesListв то время как предыдущая findверсия будет это делать, поэтому в зависимости от вашего фактического варианта использования вы, возможно, не сможете упростить ее.

Что касается поиска в этих файлах, вам понадобится использовать grepследующую конструкцию:

if (grep needle haystack > /dev/null 2>&1)
then
  echo $f
fi

Когда grepнаходит иголку, которую ищет, возвращает ненулевое значение, поэтому условие оценивается как ИСТИНА. Я использую , > /dev/null 2>&1чтобы не видеть результаты grep. Если grepиголка в стоге сена не найдена, код возврата равен 0, поэтому условное выражение ЛОЖЬ, обходя оператор then.

Связанный контент