如何在执行查找时跳过多个目录

时间:2017-12-13 17:59:54

标签: linux text grep directory find

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

findTEXTinFILES /path/to/search 'text-to-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 \;
}

1 个答案:

答案 0 :(得分:2)

find expression主要由与运算符连接在一起的 tests actions 组成。它以标准的短路方式进行评估 - 意味着一旦结果已知就停止评估,而无需评估所有部分(例如,true or anything被评估为true)。 / p>

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

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

find . -path './wp-*' -prune -o -print

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

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

find . -path './wp-*' -prune -o -path ./logs -prune -o -print

这里:如果没有执行第一个修剪动作(结果false),那么第二个就有机会,如果它既没有修剪(结果false),那么{ {1}}已执行操作。如果对任何-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 \; - 依赖路径,您可以$1并使用f.e. cd "$1"