Add a new primary '-exit n':
This primary causes find to stop traversing the filesystem and exit immediately if a previous condition was met. If no value is specified, the exit value will be 0, else n. Note that other primaries will be evaluated and acted upon before exiting. Ok matt@, garbled@.
This commit is contained in:
parent
6f20259365
commit
a32f19d465
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: extern.h,v 1.22 2005/11/09 00:47:16 reed Exp $ */
|
||||
/* $NetBSD: extern.h,v 1.23 2006/02/20 16:31:02 jschauma Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1991, 1993, 1994
|
||||
@ -56,6 +56,7 @@ PLAN *c_depth __P((char ***, int));
|
||||
PLAN *c_empty __P((char ***, int));
|
||||
PLAN *c_exec __P((char ***, int));
|
||||
PLAN *c_execdir __P((char ***, int));
|
||||
PLAN *c_exit __P((char ***, int));
|
||||
PLAN *c_false __P((char ***, int));
|
||||
PLAN *c_flags __P((char ***, int));
|
||||
PLAN *c_follow __P((char ***, int));
|
||||
|
@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: find.1,v 1.55 2005/11/09 00:47:16 reed Exp $
|
||||
.\" $NetBSD: find.1,v 1.56 2006/02/20 16:31:02 jschauma Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1990, 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
@ -32,7 +32,7 @@
|
||||
.\"
|
||||
.\" from: @(#)find.1 8.7 (Berkeley) 5/9/95
|
||||
.\"
|
||||
.Dd November 8, 2005
|
||||
.Dd February 20, 2006
|
||||
.Dt FIND 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -232,6 +232,14 @@ the current file.
|
||||
The filename substituted for the string
|
||||
.Dq {}
|
||||
is not qualified.
|
||||
.It Ic -exit Op Ar n
|
||||
This primary causes
|
||||
.Nm
|
||||
to stop traversing the filesystem and exit immediately if a
|
||||
previous condition was met.
|
||||
If no value is specified, the exit value will be 0, else
|
||||
.Ar n .
|
||||
Note that other primaries will be evaluated and acted upon before exiting.
|
||||
.It Ic -false
|
||||
This primary always evaluates to false.
|
||||
This can be used following a primary that caused the
|
||||
@ -454,6 +462,7 @@ It prints the pathname of the current file to standard output, followed
|
||||
by a newline character.
|
||||
If none of
|
||||
.Ic -exec ,
|
||||
.Ic -exit ,
|
||||
.Ic -fprint ,
|
||||
.Ic -ls ,
|
||||
.Ic -ok ,
|
||||
@ -611,6 +620,16 @@ Print out a list of all the files that are either owned by
|
||||
.Dq wnj
|
||||
or that are newer than
|
||||
.Dq ttt .
|
||||
.It Li "find / \e( -newer ttt -or -user wnj \e) -exit 1"
|
||||
Return immediately with a value of 1 if any files are found that are either
|
||||
owned by
|
||||
.Dq wnj
|
||||
or that are newer than
|
||||
.Dq ttt ,
|
||||
but do not print them.
|
||||
.It Li "find / \e( -newer ttt -or -user wnj \e) -ls -exit 1"
|
||||
Same as above, but list the first file matching the criteria before exiting
|
||||
with a value of 1.
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr chflags 1 ,
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: find.c,v 1.20 2005/10/12 20:03:59 reed Exp $ */
|
||||
/* $NetBSD: find.c,v 1.21 2006/02/20 16:31:02 jschauma Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1991, 1993, 1994
|
||||
@ -37,7 +37,7 @@
|
||||
#if 0
|
||||
static char sccsid[] = "from: @(#)find.c 8.5 (Berkeley) 8/5/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: find.c,v 1.20 2005/10/12 20:03:59 reed Exp $");
|
||||
__RCSID("$NetBSD: find.c,v 1.21 2006/02/20 16:31:02 jschauma Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
@ -98,9 +98,9 @@ find_formplan(argv)
|
||||
}
|
||||
|
||||
/*
|
||||
* if the user didn't specify one of -print, -ok, -fprint, or -exec,
|
||||
* then -print is assumed so we bracket the current expression with
|
||||
* parens, if necessary, and add a -print node on the end.
|
||||
* if the user didn't specify one of -print, -ok, -fprint, -exec, or
|
||||
* -exit, then -print is assumed so we bracket the current expression
|
||||
* with parens, if necessary, and add a -print node on the end.
|
||||
*/
|
||||
if (!isoutput) {
|
||||
if (plan == NULL) {
|
||||
@ -189,14 +189,16 @@ find_execute(plan, paths)
|
||||
char **paths; /* array of pathnames to traverse */
|
||||
{
|
||||
PLAN *p;
|
||||
int rval;
|
||||
int rval, cval;
|
||||
sigset_t s;
|
||||
|
||||
cval = 1;
|
||||
|
||||
if (!(tree = fts_open(paths, ftsoptions, issort ? ftscompare : NULL)))
|
||||
err(1, "ftsopen");
|
||||
|
||||
sig_lock(&s);
|
||||
for (rval = 0; (g_entry = fts_read(tree)) != NULL; sig_lock(&s)) {
|
||||
for (rval = 0; cval && (g_entry = fts_read(tree)) != NULL; sig_lock(&s)) {
|
||||
sig_unlock(&s);
|
||||
switch (g_entry->fts_info) {
|
||||
case FTS_D:
|
||||
@ -230,8 +232,12 @@ find_execute(plan, paths)
|
||||
* the work specified by the user on the command line.
|
||||
*/
|
||||
for (p = plan; p && (p->eval)(p, g_entry); p = p->next)
|
||||
;
|
||||
if (p->type == N_EXIT) {
|
||||
rval = p->exit_val;
|
||||
cval = 0;
|
||||
}
|
||||
}
|
||||
|
||||
sig_unlock(&s);
|
||||
if (errno)
|
||||
err(1, "fts_read");
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: find.h,v 1.20 2005/11/09 00:47:16 reed Exp $ */
|
||||
/* $NetBSD: find.h,v 1.21 2006/02/20 16:31:02 jschauma Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993
|
||||
@ -40,7 +40,7 @@
|
||||
enum ntype {
|
||||
N_AND = 1, /* must start > 0 */
|
||||
N_AMIN, N_ANEWER, N_ATIME, N_CLOSEPAREN, N_CMIN, N_CNEWER, N_CTIME,
|
||||
N_DEPTH, N_EMPTY, N_EXEC, N_EXECDIR, N_EXPR, N_FALSE, N_FLAGS,
|
||||
N_DEPTH, N_EMPTY, N_EXEC, N_EXECDIR, N_EXIT, N_EXPR, N_FALSE, N_FLAGS,
|
||||
N_FOLLOW, N_FPRINT, N_FSTYPE, N_GROUP,
|
||||
N_INAME, N_INUM, N_IREGEX, N_LINKS, N_LS, N_MINDEPTH, N_MAXDEPTH,
|
||||
N_MMIN, N_MTIME, N_NAME, N_NEWER, N_NOGROUP, N_NOT, N_NOUSER, N_OK,
|
||||
@ -80,6 +80,7 @@ typedef struct _plandata {
|
||||
} ex;
|
||||
char *_a_data[2]; /* array of char pointers */
|
||||
char *_c_data; /* char pointer */
|
||||
int _exit_val; /* exit value */
|
||||
int _max_data; /* tree depth */
|
||||
int _min_data; /* tree depth */
|
||||
regex_t _regexp_data; /* compiled regexp */
|
||||
@ -101,6 +102,7 @@ typedef struct _plandata {
|
||||
#define e_argv p_un.ex._e_argv
|
||||
#define e_orig p_un.ex._e_orig
|
||||
#define e_len p_un.ex._e_len
|
||||
#define exit_val p_un._exit_val
|
||||
#define max_data p_un._max_data
|
||||
#define min_data p_un._min_data
|
||||
#define regexp_data p_un._regexp_data
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: function.c,v 1.52 2005/11/09 00:47:16 reed Exp $ */
|
||||
/* $NetBSD: function.c,v 1.53 2006/02/20 16:31:02 jschauma Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993
|
||||
@ -37,7 +37,7 @@
|
||||
#if 0
|
||||
static char sccsid[] = "from: @(#)function.c 8.10 (Berkeley) 5/4/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: function.c,v 1.52 2005/11/09 00:47:16 reed Exp $");
|
||||
__RCSID("$NetBSD: function.c,v 1.53 2006/02/20 16:31:02 jschauma Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
@ -648,6 +648,29 @@ c_execdir(argvp, isok)
|
||||
return (new);
|
||||
}
|
||||
|
||||
PLAN *
|
||||
c_exit(argvp, isok)
|
||||
char ***argvp;
|
||||
int isok;
|
||||
{
|
||||
char *arg = **argvp;
|
||||
PLAN *new;
|
||||
|
||||
/* not technically true, but otherwise '-print' is implied */
|
||||
isoutput = 1;
|
||||
|
||||
new = palloc(N_EXIT, f_always_true);
|
||||
|
||||
if (arg) {
|
||||
(*argvp)++;
|
||||
new->exit_val = find_parsenum(new, "-exit", arg, NULL);
|
||||
} else
|
||||
new->exit_val = 0;
|
||||
|
||||
return (new);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* -false function
|
||||
*/
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: option.c,v 1.22 2005/11/09 00:47:16 reed Exp $ */
|
||||
/* $NetBSD: option.c,v 1.23 2006/02/20 16:31:03 jschauma Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993, 1994
|
||||
@ -37,7 +37,7 @@
|
||||
#if 0
|
||||
static char sccsid[] = "from: @(#)option.c 8.2 (Berkeley) 4/16/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: option.c,v 1.22 2005/11/09 00:47:16 reed Exp $");
|
||||
__RCSID("$NetBSD: option.c,v 1.23 2006/02/20 16:31:03 jschauma Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
@ -72,6 +72,7 @@ static OPTION const options[] = {
|
||||
{ "-empty", N_EMPTY, c_empty, 0 },
|
||||
{ "-exec", N_EXEC, c_exec, 1 },
|
||||
{ "-execdir", N_EXECDIR, c_execdir, 1 },
|
||||
{ "-exit", N_EXIT, c_exit, 0 },
|
||||
{ "-false", N_FALSE, c_false, 0 },
|
||||
{ "-flags", N_FLAGS, c_flags, 1 },
|
||||
{ "-follow", N_FOLLOW, c_follow, 0 },
|
||||
|
Loading…
Reference in New Issue
Block a user