我正在尝试编写一个脚本,该脚本基本上使用 find (或其他方法)递归搜索以查找以 *.p 或 *.w 结尾但不包含 sysvars.i 或 preprocess.i 的所有文件
find 是最好使用的命令吗?
答案1
find
您可以结合和的操作grep
来完成此操作:
find /search/path/ -type f \( -name '*.p' -or -name '*.w' \) \
-exec grep -L -e 'sysvars.i' -e 'preprocess.i' {} +
让我们来分解一下。
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'
指定两次以列出您不想匹配的两个搜索字符串。
答案2
可以构建查找测试的复杂布尔表达式:
find . \( -name '*.p' -or -name '*.w' \) -and \
-not \( -name 'sysvars.i' -or -name 'preprocess.i' \)
Posix 兼容选项名称是-a
,-o
和,!
而不是-and
, -or
and -not
。
如果您需要在文件内容中查找字符串,那么您必须使用find
with grep
(例如)。