用于查找具有特定扩展名但不包含特定文本的文件的脚本

col*_*lin 3 find

我正在尝试编写一个脚本,该脚本基本上使用 find(或其他方法)递归搜索以查找所有以 *.p 或 *.w 结尾但不包含 sysvars.i 或 preprocess.i 的文件

find 是最好的命令吗?

Cal*_*leb 5

您可以组合的行为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' 指定两次以列出您不想匹配的两个搜索字符串。