Да, поскольку с этим синтаксисом grep
ожидает обработки файлов, а не каталогов. Минимальное изменение в вашем сценарии - проверить, является ли $f
файлом или нет:
...
if [ -f "$f" ] && grep -q 'search_term' $f; then
...
На самом деле вы, возможно, захотите получить список файлов с соответствием паттер и действовать на них:
while read f; do
: #action on file file $f
done < <(grep -rl 'search_term' $direc/)
Я выбрал получение списка файлов через <(list)
, потому что передача его в while
приведет к запуску внутренней части вашего цикла в другом процессе (что может быть проблемой, в частности, если вы ожидаете какой-либо переменная (изменения) должна быть доступна извне. И в отличие от простой для с ``
она не так чувствительна к тому, с какими именами файлов вы сталкиваетесь (а именно, я имею в виду пробелы, это все равно будет путать с новыми строками).
while read -d "" f; do
: #action on file file $f
done < <(grep -rZl 'search_term' $direc/)
Ничто не должно сбивать с толку это, поскольку записи имеют нулевой символ и не должны появляться в имени файла.