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

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

我正在尝试编写一个脚本,该脚本基本上使用 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, -orand -not

如果您需要在文件内容中查找字符串,那么您必须使用findwith grep(例如)。

相关内容