Date: Thu, 01 Jun 2000 13:25:54 +0100
From: Ben Smithurst <ben@scientia.demon.co.uk>
To: FreeBSD-gnats-submit@freebsd.org
Subject: bin/18941: Adding -{min,max}depth options to find(1)
Message-ID: <E12xU2s-0001ua-00@strontium.scientia.demon.co.uk>
next in thread | raw e-mail | index | archive | help
>Number: 18941
>Category: bin
>Synopsis: Adding -{min,max}depth options to find(1)
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Thu Jun 01 05:50:06 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator: Ben Smithurst
>Release: FreeBSD 4.0-STABLE i386
>Organization:
>Environment:
>Description:
This patch adds the -mindepth and -maxdepth options to find(1), which
behave as in GNU find (and of course as described in the manual page
diff included). I think these options would be useful for some people.
Some missing $FreeBSD$ tags are also added.
I posted this patch on -hackers a month or two ago; there was only
response from kris (something like "good idea, but I haven't reviewed
the patch") so I thought I'd send-pr it.
>How-To-Repeat:
>Fix:
Index: extern.h
===================================================================
RCS file: /usr/cvs/src/usr.bin/find/extern.h,v
retrieving revision 1.9
diff -u -r1.9 extern.h
--- extern.h 1999/12/19 15:43:18 1.9
+++ extern.h 2000/04/30 02:03:36
@@ -80,9 +80,12 @@
PLAN *c_xdev __P((void));
PLAN *c_openparen __P((void));
PLAN *c_closeparen __P((void));
+PLAN *c_maxdepth __P((char *));
+PLAN *c_mindepth __P((char *));
PLAN *c_mmin __P((char *));
PLAN *c_mtime __P((char *));
PLAN *c_not __P((void));
PLAN *c_or __P((void));
-extern int ftsoptions, isdeprecated, isdepth, isoutput, issort, isxargs;
+extern int ftsoptions, isdeprecated, isdepth, isoutput, issort, isxargs,
+ mindepth, maxdepth;
Index: find.1
===================================================================
RCS file: /usr/cvs/src/usr.bin/find/find.1,v
retrieving revision 1.23
diff -u -r1.23 find.1
--- find.1 2000/03/01 10:48:32 1.23
+++ find.1 2000/04/28 19:48:12
@@ -245,6 +245,12 @@
If the file is a symbolic link, the pathname of the linked\-to file will be
displayed preceded by ``\->''.
The format is identical to that produced by ``ls \-dgils''.
+.It Ic -maxdepth Ar n
+True if the depth of the current file into the tree is less than or equal to
+.Ar n .
+.It Ic -mindepth Ar n
+True if the depth of the current file into the tree is greater than or equal to
+.Ar n .
.It Ic -mmin Ar n
True if the difference between the file last modification time and the time
.Nm find
Index: find.c
===================================================================
RCS file: /usr/cvs/src/usr.bin/find/find.c,v
retrieving revision 1.7
diff -u -r1.7 find.c
--- find.c 1998/11/29 11:34:30 1.7
+++ find.c 2000/04/30 02:43:35
@@ -35,7 +35,9 @@
*/
#ifndef lint
-static char sccsid[] = "@(#)find.c 8.5 (Berkeley) 8/5/94";
+static const char sccsid[] = "@(#)find.c 8.5 (Berkeley) 8/5/94";
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include <sys/types.h>
@@ -206,12 +208,21 @@
continue;
}
+ if (mindepth != -1 && entry->fts_level < mindepth)
+ continue;
+
/*
* Call all the functions in the execution plan until one is
* false or all have been executed. This is where we do all
* the work specified by the user on the command line.
*/
for (p = plan; p && (p->eval)(p, entry); p = p->next);
+
+ if (maxdepth != -1 && entry->fts_level >= maxdepth) {
+ if (fts_set(tree, entry, FTS_SKIP))
+ err(1, "%s", entry->fts_path);
+ continue;
+ }
}
if (errno)
err(1, "fts_read");
Index: find.h
===================================================================
RCS file: /usr/cvs/src/usr.bin/find/find.h,v
retrieving revision 1.6
diff -u -r1.6 find.h
--- find.h 1999/12/19 15:43:18 1.6
+++ find.h 2000/04/28 19:44:31
@@ -46,7 +46,7 @@
N_MTIME, N_NAME,
N_NEWER, N_NOGROUP, N_NOT, N_NOUSER, N_OK, N_OPENPAREN, N_OR, N_PATH,
N_PERM, N_PRINT, N_PRUNE, N_SIZE, N_TYPE, N_USER, N_XDEV,
- N_PRINT0, N_DELETE
+ N_PRINT0, N_DELETE, N_MAXDEPTH, N_MINDEPTH
};
/* node definition */
Index: function.c
===================================================================
RCS file: /usr/cvs/src/usr.bin/find/function.c,v
retrieving revision 1.22
diff -u -r1.22 function.c
--- function.c 2000/02/05 18:42:34 1.22
+++ function.c 2000/04/30 02:16:30
@@ -35,8 +35,9 @@
*/
#ifndef lint
-static char sccsid[] = "@(#)function.c 8.10 (Berkeley) 5/4/95";
-static char rcsid[] = "$FreeBSD: src/usr.bin/find/function.c,v 1.22 2000/02/05 18:42:34 joe Exp $";
+static const char sccsid[] = "@(#)function.c 8.10 (Berkeley) 5/4/95";
+static const char rcsid[] =
+ "$FreeBSD: src/usr.bin/find/function.c,v 1.22 2000/02/05 18:42:34 joe Exp $";
#endif /* not lint */
#include <sys/param.h>
@@ -717,6 +718,68 @@
}
/*
+ * -maxdepth n functions --
+ *
+ * Does the same as -prune if the level of the current file is greater
+ * than the specified maximum depth.
+ *
+ * Note that -maxdepth and -mindepth are handled specially in
+ * find_execute() so their f_* functions here do nothing.
+ */
+int
+f_maxdepth(plan, entry)
+ PLAN *plan;
+ FTSENT *entry;
+{
+ return (1);
+}
+
+PLAN *
+c_maxdepth(arg)
+ char *arg;
+{
+ PLAN *new;
+
+ if (*arg == '-')
+ /* all other errors handled by find_parsenum() */
+ errx(1, "-maxdepth: %s: value must be positive", arg);
+
+ new = palloc(N_MAXDEPTH, f_maxdepth);
+ maxdepth = find_parsenum(new, "-maxdepth", arg, NULL);
+ return (new);
+
+}
+
+/*
+ * -mindepth n functions --
+ *
+ * True if the current file is at or deeper than the specified minimum
+ * depth.
+ */
+int
+f_mindepth(plan, entry)
+ PLAN *plan;
+ FTSENT *entry;
+{
+ return (1);
+}
+
+PLAN *
+c_mindepth(arg)
+ char *arg;
+{
+ PLAN *new;
+
+ if (*arg == '-')
+ /* all other errors handled by find_parsenum() */
+ errx(1, "-maxdepth: %s: value must be positive", arg);
+
+ new = palloc(N_MINDEPTH, f_mindepth);
+ mindepth = find_parsenum(new, "-mindepth", arg, NULL);
+ return (new);
+}
+
+/*
* -mtime n functions --
*
* True if the difference between the file modification time and the
@@ -1005,9 +1068,6 @@
#endif
return new;
}
-
- /*
-
/*
* -print functions --
Index: ls.c
===================================================================
RCS file: /usr/cvs/src/usr.bin/find/ls.c,v
retrieving revision 1.5
diff -u -r1.5 ls.c
--- ls.c 1998/07/06 21:01:14 1.5
+++ ls.c 2000/04/30 02:18:13
@@ -32,7 +32,9 @@
*/
#ifndef lint
-static char sccsid[] = "@(#)ls.c 8.1 (Berkeley) 6/6/93";
+static const char sccsid[] = "@(#)ls.c 8.1 (Berkeley) 6/6/93";
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include <sys/param.h>
Index: main.c
===================================================================
RCS file: /usr/cvs/src/usr.bin/find/main.c,v
retrieving revision 1.9
diff -u -r1.9 main.c
--- main.c 1998/11/29 11:34:30 1.9
+++ main.c 2000/04/30 02:18:17
@@ -41,7 +41,9 @@
#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)main.c 8.4 (Berkeley) 5/4/95";
+static const char sccsid[] = "@(#)main.c 8.4 (Berkeley) 5/4/95";
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include <sys/types.h>
@@ -67,6 +69,7 @@
int isoutput; /* user specified output operator */
int issort; /* do hierarchies in lexicographical order */
int isxargs; /* don't permit xargs delimiting chars */
+int mindepth = -1, maxdepth = -1; /* minimum and maximum depth */
static void usage __P((void));
Index: misc.c
===================================================================
RCS file: /usr/cvs/src/usr.bin/find/misc.c,v
retrieving revision 1.2
diff -u -r1.2 misc.c
--- misc.c 1995/05/30 06:30:13 1.2
+++ misc.c 2000/04/30 02:18:20
@@ -35,7 +35,9 @@
*/
#ifndef lint
-static char sccsid[] = "@(#)misc.c 8.2 (Berkeley) 4/1/94";
+static const char sccsid[] = "@(#)misc.c 8.2 (Berkeley) 4/1/94";
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include <sys/types.h>
Index: operator.c
===================================================================
RCS file: /usr/cvs/src/usr.bin/find/operator.c,v
retrieving revision 1.5
diff -u -r1.5 operator.c
--- operator.c 1998/11/29 12:17:09 1.5
+++ operator.c 2000/04/30 02:18:23
@@ -35,7 +35,9 @@
*/
#ifndef lint
-static char sccsid[] = "@(#)operator.c 8.1 (Berkeley) 6/6/93";
+static const char sccsid[] = "@(#)operator.c 8.1 (Berkeley) 6/6/93";
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include <sys/types.h>
Index: option.c
===================================================================
RCS file: /usr/cvs/src/usr.bin/find/option.c,v
retrieving revision 1.9
diff -u -r1.9 option.c
--- option.c 1999/12/19 15:43:19 1.9
+++ option.c 2000/04/30 02:18:28
@@ -84,6 +84,8 @@
{ "-inum", N_INUM, c_inum, O_ARGV },
{ "-links", N_LINKS, c_links, O_ARGV },
{ "-ls", N_LS, c_ls, O_ZERO },
+ { "-maxdepth", N_MAXDEPTH, c_maxdepth, O_ARGV },
+ { "-mindepth", N_MINDEPTH, c_mindepth, O_ARGV },
{ "-mmin", N_MMIN, c_mmin, O_ARGV },
{ "-mtime", N_MTIME, c_mtime, O_ARGV },
{ "-name", N_NAME, c_name, O_ARGV },
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?E12xU2s-0001ua-00>
