查找时如何跳过多个目录

Fra*_*nce 7 linux directory grep text find

我编写了一个 find 函数,它在给定路径中的每个文件中搜索一个字符串,同时跳过我不想搜索的目录名称列表。我已经把这个脚本放在我的 .bashrc 文件中,像这样调用:

findTEXTinFILES /path/to/search 'text-to-find'
Run Code Online (Sandbox Code Playgroud)

find 部分效果很好,它为搜索文本着色,使其在视觉上脱颖而出!,但我无法让它跳过用 -prune 列出的目录。我已经阅读了我能找到的所有帖子,但没有一个对我有用。我尝试了多种变体,但都没有运气。所以我有几个问题:

  • 如何跳过多个目录?
  • 如何跳过仅具有部分名称的目录,例如以“--”或“wp-”开头的目录?
  • 您可以在同一个脚本中混合使用-name-path标准吗?
  • 还有什么我错过的吗?

我的服务器是带有 bash shell 的 CENTOS 6.9 virtuozzo。

function findTEXTinFILES {

find "$1" ! \( -name .bash_history -prune \
    -o ! -path tmp -prune \
    -o ! -path short -prune \
    -o ! -path "*/_not_used/*" -prune \
    -o ! -path backups -prune \
    -o ! -path temp_logs -prune \
    -o ! -name .cpan -prune \
    -o ! -name .cpobjcache -prune \
    -o ! -path files_to_compare -prune \
    -o ! -path logs -prune \
    -o ! -path mail -prune  \
    -o ! -path old -prune \
    -o ! -path '--*' -prune \
    -o ! -path 'wp-*' -prune \
    -o ! -path '*copy*' -prune \) \
    -o -name "*" \
    -exec grep $2 -I --color -Hn '$3' '{}' 2>/dev/null \;
}
Run Code Online (Sandbox Code Playgroud)

ran*_*mir 13

find表达主要由测试动作与接合在一起运营商。它以标准短路方式进行评估——这意味着一旦知道结果就停止评估,而无需评估所有部分(例如true or anything评估为true)。

现在请注意,这-prune是一个始终返回的操作true。它可以对任何测试的结果起作用。另请注意,默认运算符是-a()。

因此,最简单的修剪示例,打印除某些路径下的文件以外的所有文件(例如,wp-*在您的示例中)如下所示:

find . -path './wp-*' -prune -o -print
Run Code Online (Sandbox Code Playgroud)

对于匹配以 开头的路径的文件./wp-,执行剪枝操作,即结果为true,并且可以忽略OR运算符的右侧部分(即不打印文件)。注意这里-path匹配相对路径,在这种情况下根于.,所以我们必须写./wp-*而不是wp-*

要修剪两条路径,只需扩展:

find . -path './wp-*' -prune -o -path ./logs -prune -o -print
Run Code Online (Sandbox Code Playgroud)

这里:如果第一个修剪动作没有执行(result false),那么给第二个机会,如果这两个都不修剪(result false),然后-print动作被执行。万一-prune被评估,-print就没有机会。

将此应用于您的案例:

find "$1" -name .bash_history -prune \
    -o -path "$1/tmp" -prune \
    -o -path "$1/short" -prune \
    -o -path "$1/*/_not_used/*" -prune \
    -o -path "$1/backups" -prune \
    -o -path "$1/temp_logs" -prune \
    -o -name "$1/.cpan" -prune \
    -o -name "$1/.cpobjcache" -prune \
    -o -path "$1/files_to_compare" -prune \
    -o -path "$1/logs" -prune \
    -o -path "$1/mail" -prune  \
    -o -path "$1/old" -prune \
    -o -path "$1/--*" -prune \
    -o -path "$1/wp-*" -prune \
    -o -path "$1/*copy*" -prune \
    -exec grep $2 -I --color -Hn '$3' '{}' 2>/dev/null \;
Run Code Online (Sandbox Code Playgroud)

为避免编写$1依赖路径,您可以cd "$1"使用 fe find . ... -path ./logs ...