linux Bash -查找exec返回值

3bygqnnd  于 2023-11-17  发布在  Linux
关注(0)|答案(5)|浏览(113)

我需要一种方法来判断grep是否找到了什么,并理想地将返回值传递给if语句。
假设我有一个tmp文件夹(当前文件夹),在有几个文件和子文件夹。我想搜索所有文件名为abc的模式xyz。搜索被认为是成功的,如果它发现任何出现xyz(不管找到xyz多少次)。如果没有找到xyz,则搜索失败。
在bash中,可以这样做:

find . -name "abc" -exec grep "xyz" {} \;

字符串
这将显示是否找到了xyz,但我不确定如何将结果(成功与否)传递回if语句。
如果你能帮忙的话,我将不胜感激。

2q5ifsrm

2q5ifsrm1#

你可以尝试

x=`find . -name abc | xargs grep xyz`
echo $x

字符串
或者,正确处理文件名中的空格和尾行:

x=`find . -name abc -print0 | xargs -0 grep xyz`
echo $x


也就是说,x包含了你的返回值。当没有匹配项时,它是空的。

332nm8kg

332nm8kg2#

如果你想知道find找到了一些文件abc,并且其中至少有一个文件包含字符串xyz,那么你可以用途:

if find . -name 'abc' -type f -exec grep -q xyz {} +
then : All invocations of grep found at least one xyz and nothing else failed
else : One or more invocations of grep failed to find xyz or something else failed
fi

字符串
这依赖于find返回其自身操作的退出状态,以及它所执行的任何命令的非零退出状态。最后的+find认为合理的尽可能多的文件名分组到单个命令行中。您需要相当多的文件名(大量相当长的名称)来使find多次运行grep。在运行Mac OS X 10. 10. 4的Mac上,我得到了大约3,000个文件,每个文件的名称中大约有32个字符,对于一个刚刚超过100 KiB的参数列表,没有grep被运行多次。OTOH,当我有不到8000个文件时,我得到了两次grep的运行,每次大约130 KiB的参数列表。
有人简短地留下了一条评论,询问find的退出状态是否得到保证。答案是“yes”-尽管我不得不修改一下我对退出状态的描述。在-exec的描述下,POSIX指定:
如果任何调用 ['实用程序',例如本问题中的grep] 返回非零值作为退出状态,则find实用程序应返回非零退出状态。
在一般的“退出状态”下,它说:
应返回以下退出值:
0-成功遍历所有路径操作数。
>0-发生错误。
因此,只要find自己的操作没有失败,并且只要它调用的grep命令没有失败,find就将报告成功。找到零个文件但没有失败将被报告为成功。(失败可能是缺乏搜索目录的权限,例如。)

tcbh2hod

tcbh2hod3#

find返回-exec 'd命令的结果作为其结果,只需将命令放在if语句中:

if [[ -n $(find . -name "abc" -exec grep "xyz" {} \;) ]]
then
   # do something
fi

字符串

m3eecexj

m3eecexj4#

可以给grep命令提供一个-q选项,该选项将使其输出“安静”。Grep将根据是否在您指向的文件中找到任何内容返回成功或失败。
如果你的shell有这个能力,而不是试图解析find命令的输出,你可能想尝试使用for循环。例如在bash中:

shopt -s globstar

cd /some/directory

for file in **/abc; do
  grep -q "xyz" "$file" && echo "Found something in $file"
done

字符串
你在找这个吗?

eqfvzcg8

eqfvzcg85#

我相信你应该可以用grep和--include来做到这一点。
就像这样:

if grep -r --include=abc -q xyz; then
    : Found at least one match
else
    : No matching lines found
fi

字符串

相关问题