find . -path ./src/emacs -prune -o -print
-a -o和 && || 一样都有短路性;
实际可以理解为这样(find condition1 && -prune || -print) find . -path ./src/emacs -a -prune -o -print, 如果find . -path ./src/emacs返回真(就是找到的内容匹配),那接着执行-prune进行忽略处理,由于短路原因跳过-print; 如果find . -path ./src/emacs返回假(就是说找到的内容不匹配),由于短路原因就会跳过-prune来执行-print,打印出这些不匹配的内容;
以此类推,不满足条件1,2,3而满足条件4的语句就该是这样的:
find condition1 -prune -o condition2 -prune -o condition3 -prune -o condition4 -print
应用举例:
红色部分作用是排除.repo .git目录,绿色部分作用是限制找到的文件后缀必须是.c/.cc/.cpp/.h,蓝色作用是将输出的结果的间隔符号换成‘\0'(以便处理文件名称中包含空格的情况),紫色部分将结果作为grep的输入(-0代表以’\0'作为间隔符),最后grep找到参数中要求的字符并且用颜色标记,加上行号。
- function cgrep()
- {
- find . -name .repo -prune -o -name .git -prune -o -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' \) -print0 | xargs -0 grep --color -n "$@"
- }