
Я пытаюсь перебрать файлы в каталоге, которые начинаются со строки, указанной в 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
.