我试图循环遍历目录中以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
找到它正在寻找的针时,它返回一个非零值,因此条件评估为 TRUE。我使用 来> /dev/null 2>&1
避免看到 的结果grep
。如果grep
大海捞针,则返回码为0,因此条件为FALSE,绕过该then
语句。