我编写了一个find函数,用于在给定路径中的每个文件中搜索字符串,同时跳过我不想搜索的目录名列表。我已经将这个脚本放在我的.bashrc文件中,就像这样调用:
findTEXTinFILES /path/to/search 'text-to-find'
查找部分效果很好,它会使搜索文本着色,以便在视觉上突出显示!但是我无法跳过-prune列出的目录。我已经阅读了我能找到的所有帖子,但没有一个对我有用。我尝试了多种变化而没有运气。所以我有几个问题:
-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 \;
}
答案 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"
。