我正在尝试编写一个脚本,该脚本基本上使用 find(或其他方法)递归搜索以查找所有以 *.p 或 *.w 结尾但不包含 sysvars.i 或 preprocess.i 的文件
find 是最好的命令吗?
您可以组合的行为find
,并grep
做到这一点:
find /search/path/ -type f \( -name '*.p' -or -name '*.w' \) \
-exec grep -L -e 'sysvars.i' -e 'preprocess.i' {} +
Run Code Online (Sandbox Code Playgroud)
让我们分解一下。
find /serch/path
返回指定路径中的所有文件。接下来,我们需要从首先消除最多匹配的事情开始缩小范围,以节省稍后检查其他事情的时间。-type f
只返回文件。如果您碰巧有与文件名模式匹配的目录,我们不想将它们发送到grep
.\( [expr1] -or [expr2] \)
创建一个或/或匹配,以便 find 返回满足 expr1 或 expr2 的文件,但没有理由必须匹配两者。括号有助于将这个或组与实际和要求的其余匹配选项分开。-name '*.p'
并且-name '*.w'
是相当明显的,返回匹配的文件名的那些模式。-exec command {} +
将运行指定的命令和任何参数,该{}
位替换为与find
命令其余部分匹配的每个文件的参数。该-exec
函数比使用xargs
循环或管道循环更可取,因为它可以很好地处理引用和文件名问题。grep
用于在指定文件中搜索模式。
-L
用于仅返回不匹配的文件名列表-e 'PATTERN'
指定两次以列出您不想匹配的两个搜索字符串。