Clifford Wolf : Added --include-exclude-dirs option which causes include/exclude patterns to also be applied on directory names. --- grep-2.5.1a/doc/grep.1.orig 2007-06-21 08:20:11.000000000 +0200 +++ grep-2.5.1a/doc/grep.1 2007-06-21 08:21:37.000000000 +0200 @@ -329,6 +329,10 @@ Recurse in directories skip file matching .I PATTERN. .TP +.BR "\fR \fP \-\^\-include-exclude-dirs" +When processing directories recursively, apply the include and exclude patterns +also to directory names. +.TP .BR \-s ", " \-\^\-no-messages Suppress error messages about nonexistent or unreadable files. Portability note: unlike \s-1GNU\s0 --- grep-2.5.1a/doc/grep.texi.orig 2007-06-21 08:19:41.000000000 +0200 +++ grep-2.5.1a/doc/grep.texi 2007-06-21 08:14:34.000000000 +0200 @@ -425,6 +425,12 @@ @cindex searching directory trees When processing directories recursively, skip files matching @var{file_pattern}. address@hidden --include-exclude-dirs address@hidden --include-exclude-dirs address@hidden include/exclude directories +When processing directories recursively, apply the include and exclude patterns +also to directory names. + @item -m @var{num} @itemx address@hidden @opindex -m --- grep-2.5.1a/lib/savedir.c.orig 2007-06-21 08:06:24.000000000 +0200 +++ grep-2.5.1a/lib/savedir.c 2007-06-21 08:07:15.000000000 +0200 @@ -100,7 +100,7 @@ Return NULL if DIR cannot be opened or if out of memory. */ char * savedir (const char *dir, off_t name_size, struct exclude *included_patterns, - struct exclude *excluded_patterns) + struct exclude *excluded_patterns, int include_exclude_dirs) { DIR *dirp; struct dirent *dp; @@ -134,7 +134,7 @@ off_t size_needed = (namep - name_space) + NAMLEN (dp) + 2; if ((included_patterns || excluded_patterns) - && !isdir1 (dir, dp->d_name)) + && (include_exclude_dirs || !isdir1 (dir, dp->d_name))) { if (included_patterns && !excluded_filename (included_patterns, dp->d_name, 0)) --- grep-2.5.1a/lib/savedir.h.orig 2007-06-21 08:07:30.000000000 +0200 +++ grep-2.5.1a/lib/savedir.h 2007-06-21 08:07:38.000000000 +0200 @@ -13,6 +13,6 @@ extern char * savedir PARAMS ((const char *dir, off_t name_size, - struct exclude *, struct exclude *)); + struct exclude *, struct exclude *, int)); #endif --- grep-2.5.1a/src/grep.c.orig 2007-06-21 08:10:08.000000000 +0200 +++ grep-2.5.1a/src/grep.c 2007-06-21 08:12:11.000000000 +0200 @@ -78,6 +78,8 @@ static struct exclude *excluded_patterns; static struct exclude *included_patterns; +static int include_exclude_dirs; + /* Short options. */ static char const short_options[] = "0123456789A:B:C:D:EFGHIPUVX:abcd:e:f:hiKLlm:noqRrsuvwxyZz"; @@ -88,6 +90,7 @@ BINARY_FILES_OPTION = CHAR_MAX + 1, COLOR_OPTION, INCLUDE_OPTION, + INCLUDE_EXCLUDE_DIRS_OPTION, EXCLUDE_OPTION, EXCLUDE_FROM_OPTION, LINE_BUFFERED_OPTION, @@ -118,6 +121,7 @@ {"fixed-strings", no_argument, NULL, 'F'}, {"help", no_argument, &show_help, 1}, {"include", required_argument, NULL, INCLUDE_OPTION}, + {"include-exclude-dirs", no_argument, NULL, INCLUDE_EXCLUDE_DIRS_OPTION}, {"ignore-case", no_argument, NULL, 'i'}, {"label", required_argument, NULL, LABEL_OPTION}, {"line-buffered", no_argument, NULL, LINE_BUFFERED_OPTION}, @@ -1002,7 +1006,7 @@ } name_space = savedir (dir, stats->stat.st_size, included_patterns, - excluded_patterns); + excluded_patterns, include_exclude_dirs); if (! name_space) { @@ -1102,6 +1106,7 @@ --include=PATTERN files that match PATTERN will be examined\n\ --exclude=PATTERN files that match PATTERN will be skipped.\n\ --exclude-from=FILE files that match PATTERN in FILE will be skipped.\n\ + --include-exclude-dirs also apply include/exclude patterns on directories\n\ -L, --files-without-match only print FILE names containing no match\n\ -l, --files-with-matches only print FILE names containing matches\n\ -c, --count only print a count of matching lines per FILE\n\ @@ -1613,6 +1618,10 @@ add_exclude (included_patterns, optarg); break; + case INCLUDE_EXCLUDE_DIRS_OPTION: + include_exclude_dirs = 1; + break; + case LINE_BUFFERED_OPTION: line_buffered = 1; break;