检查文件夹中的任何文件是否包含模式,然后返回文件名

时间:2019-05-29 07:42:27

标签: bash

我正在编写一个旨在自动完成一些变量的脚本,我正在寻求帮助以实现这一目标:

我有一个启用了Nginx站点的文件夹,其中包含一些反向代理站点。 我需要:

  1. 检查在“ / volume1 / nginx / sites-enabled /”中的任何文件中是否找到模式$ var1
  2. 将包含$ var1的文件的名称返回为$ var2

非常感谢您的关注和帮助!

我找到了一些行,但是没有人尝试文件夹中的任何文件

if grep -q $var1 "/volume1/nginx/sites-enabled/testfile"; then
  echo "found"
fi

3 个答案:

答案 0 :(得分:0)

此命令是最传统,最有效的命令,可在任何Unix上运行 不需要具有特殊功能的GNU版本的grep。

效率是,xargs会根据系统限制(shell命令可能有多长时间)为grep命令提供尽可能多的文件名作为参数,并以此至少执行grep命令。可能。

使用grep的-l选项,在成功进行模式搜索后,仅显示一次文件名。

find /path -type f -print | xargs grep -l pattern

答案 1 :(得分:0)

假设您具有GNU Grep,它将把包含$var1内容的所有文件存储在array $var2中。

for file in /volume1/nginx/sites-enabled/*
do
    if grep --fixed-strings --quiet "$var1" "$file"
    then
        var2+=("$file")
    fi
done

这将循环通过NUL分隔的路径:

while IFS= read -d'' -r -u9 path
do
    …something with "$path"
done 9< <(grep --fixed-strings --files-without-match --recursive "$var1" /volume1/nginx/sites-enabled)

答案 2 :(得分:0)

findgrep可用于生成匹配文件的列表:

find /volume1/nginx/sites-enabled/ -type f -exec grep -le "${var1}" {} +

“技巧”正在使用find的{​​{1}}和-exec的{​​{1}}。

如果只希望使用文件名,则可以使用:

grep

如果要将结果分配给变量,请使用命令替换(-l):

find /volume1/nginx/sites-enabled/ -type f -exec grep -qe "${var1}" {} \; -exec basename {} \;

别忘了引用您的变量!