Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 15 May 2004 16:30:36 +0200
From:      Oliver Eikemeier <eik@FreeBSD.org>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   bin/66667: [PATCH] find(1): new primary `-level n'
Message-ID:  <E1BP0BQ-00007N-Fs@fillmore.dyndns.org>
Resent-Message-ID: <200405151440.i4FEeJav010464@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         66667
>Category:       bin
>Synopsis:       [PATCH] find(1): new primary `-level n'
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sat May 15 07:40:19 PDT 2004
>Closed-Date:
>Last-Modified:
>Originator:     Oliver Eikemeier
>Release:        FreeBSD 4.10-STABLE i386
>Organization:
Fillmore Labs - http://www.fillmore-labs.com/
>Environment:
System: FreeBSD 4.10-STABLE

>Description:

Proposal of a new primary `-level n' for find(1), that is true iff the current file
is n levels deep in the tree. The usual +/- modifiers apply to n, with `-level +-1'
essentially being a noop. Useful to find or prune files at a known depth, without
affecting files with similar characteristics at different depths.

>How-To-Repeat:

An example to list all port directories without Tools (ok, this example lists
some additional files, like packages, distfiles and CVS, but you get the idea):

  find /usr/ports -level 1 -name Tools -prune -o -level 2 -type d -print

an rough equivalent using the previous syntax is:

  find /usr/ports -mindepth 2 -maxdepth 2 -regex '.*/Tools/[^/]*' -prune -o -type d -print

Basically, this it what I was trying to do before posting PR 66613.

>Fix:

The patch applies to -CURRENT and -STABLE

--- find-level.patch begins here ---
Index: extern.h
===================================================================
RCS file: /home/ncvs/src/usr.bin/find/extern.h,v
retrieving revision 1.20
diff -u -r1.20 extern.h
--- extern.h	3 Apr 2004 17:10:04 -0000	1.20
+++ extern.h	15 May 2004 13:47:45 -0000
@@ -65,6 +65,7 @@
 #endif
 creat_f	c_group;
 creat_f	c_inum;
+creat_f	c_level;
 creat_f	c_links;
 creat_f	c_ls;
 creat_f	c_mXXdepth;
@@ -94,6 +95,7 @@
 exec_f	f_fstype;
 exec_f	f_group;
 exec_f	f_inum;
+exec_f	f_level;
 exec_f	f_links;
 exec_f	f_ls;
 exec_f	f_name;
Index: find.1
===================================================================
RCS file: /home/ncvs/src/usr.bin/find/find.1,v
retrieving revision 1.60
diff -u -r1.60 find.1
--- find.1	14 May 2004 12:58:13 -0000	1.60
+++ find.1	15 May 2004 13:47:45 -0000
@@ -408,6 +408,10 @@
 Like
 .Ic -regex ,
 but the match is case insensitive.
+.It Ic -level Ar n
+True if the depth of the file relative to the starting point of the traversal
+is 
+.Ar n .
 .It Ic -links Ar n
 True if the file has
 .Ar n
Index: find.h
===================================================================
RCS file: /home/ncvs/src/usr.bin/find/find.h,v
retrieving revision 1.16
diff -u -r1.16 find.h
--- find.h	2 Jun 2002 12:57:41 -0000	1.16
+++ find.h	15 May 2004 14:02:04 -0000
@@ -85,6 +85,7 @@
 			u_long _f_flags;
 			u_long _f_notflags;
 		} fl;
+		short _v_data;			/* level depth (-1 to N) */
 		nlink_t _l_data;		/* link count */
 		off_t _o_data;			/* file size */
 		time_t _t_data;			/* time value */
@@ -120,6 +121,7 @@
 #define	p_data	p_un._p_data
 #define	t_data	p_un._t_data
 #define	u_data	p_un._u_data
+#define	v_data	p_un._v_data
 #define	re_data	p_un._re_data
 #define	e_argv	p_un.ex._e_argv
 #define	e_orig	p_un.ex._e_orig
Index: function.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/find/function.c,v
retrieving revision 1.49
diff -u -r1.49 function.c
--- function.c	3 Apr 2004 17:10:04 -0000	1.49
+++ function.c	15 May 2004 13:47:45 -0000
@@ -943,6 +943,34 @@
 }
 
 /*
+ * -level n functions --
+ *
+ *	True if the file is at level n in the search tree.
+ */
+int
+f_level(plan, entry)
+	PLAN *plan;
+	FTSENT *entry;
+{
+	COMPARE(entry->fts_level, plan->v_data);
+}
+
+PLAN *
+c_level(option, argvp)
+	OPTION *option;
+	char ***argvp;
+{
+	char *nlevel;
+	PLAN *new;
+
+	nlevel = nextarg(option, argvp);
+
+	new = palloc(option);
+	new->v_data = find_parsenum(new, option->name, nlevel, NULL);
+	return new;
+}
+
+/*
  * -links n functions --
  *
  *	True if the file has n links.
Index: option.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/find/option.c,v
retrieving revision 1.21
diff -u -r1.21 option.c
--- option.c	3 Apr 2004 17:10:04 -0000	1.21
+++ option.c	15 May 2004 13:47:45 -0000
@@ -91,6 +91,7 @@
 	{ "-inum",	c_inum,		f_inum,		0 },
 	{ "-ipath",	c_name,		f_path,		F_IGNCASE },
 	{ "-iregex",	c_regex,	f_regex,	F_IGNCASE },
+	{ "-level",	c_level,	f_level,	0 },
 	{ "-links",	c_links,	f_links,	0 },
 	{ "-ls",	c_ls,		f_ls,		0 },
 	{ "-maxdepth",	c_mXXdepth,	f_always_true,	F_MAXDEPTH },
--- find-level.patch ends here ---

>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?E1BP0BQ-00007N-Fs>