RFC: "-exit" option for find(1)

Alfred Perlstein alfred at freebsd.org
Fri Jul 16 00:23:42 PDT 2004


I'm up too late, this doesn't work because find returns
success whenever it successfully runs thought everything.

Perhaps the primary change to just "-exit" which would
make find exit successfully, and if the primary is never
encountered (ie. our find logic never hits it) find would
exit with a non-zero exit status?

Ideas?  Better ideas?

The reason I want this is to avoid extracting a tarball
over a directory that has files in it that are newer than
the tarball.

Neither tar nor find seem to make this easy...

* Alfred Perlstein <alfred at freebsd.org> [040716 00:15] wrote:
> This adds a primary to find(1) "-exit <arg>", it will cause
> find to exit(2) with the <arg> as the exit status.
> 
> Useful for finding the first instance of something:
> 
> find . -type f -newer ../src.tar.gz -exit 0 && echo hi
> 
> this will make find abort with a zero exit status early upon
> finding a file newer than ../src.tar.gz.
> 
> cvs diff: Diffing .
> Index: extern.h
> ===================================================================
> RCS file: /home/ncvs/src/usr.bin/find/extern.h,v
> retrieving revision 1.21
> diff -u -r1.21 extern.h
> --- extern.h	28 May 2004 17:17:15 -0000	1.21
> +++ extern.h	16 Jul 2004 07:07:50 -0000
> @@ -58,6 +58,7 @@
>  creat_f	c_depth;
>  creat_f	c_empty;
>  creat_f	c_exec;
> +creat_f	c_exit;
>  creat_f	c_flags;
>  creat_f	c_follow;
>  #if !defined(__NetBSD__)
> @@ -90,6 +91,7 @@
>  exec_f	f_depth;
>  exec_f	f_empty;
>  exec_f	f_exec;
> +exec_f	f_exit;
>  exec_f	f_expr;
>  exec_f	f_flags;
>  exec_f	f_fstype;
> Index: find.1
> ===================================================================
> RCS file: /home/ncvs/src/usr.bin/find/find.1,v
> retrieving revision 1.66
> diff -u -r1.66 find.1
> --- find.1	7 Jul 2004 19:57:15 -0000	1.66
> +++ find.1	16 Jul 2004 07:12:58 -0000
> @@ -372,6 +372,10 @@
>  .Ar flags
>  bits match those of
>  .Ar notflags .
> +.It Ic -exit Ar exitstatus
> +This primary will cause the find program to exit immediately with an exit
> +status of
> +.Ar exitstatus .
>  .It Ic -fstype Ar type
>  True if the file is contained in a file system of type
>  .Ar type .
> Index: function.c
> ===================================================================
> RCS file: /home/ncvs/src/usr.bin/find/function.c,v
> retrieving revision 1.50
> diff -u -r1.50 function.c
> --- function.c	28 May 2004 17:17:15 -0000	1.50
> +++ function.c	16 Jul 2004 07:07:05 -0000
> @@ -748,6 +748,25 @@
>  }
>  
>  int
> +f_exit(PLAN *plan, FTSENT *entry)
> +{
> +
> +	exit(plan->flags);
> +}
> +
> +PLAN *
> +c_exit(OPTION *option, char ***argvp)
> +{
> +	PLAN *new;
> +	int ex;
> +
> +	ex = atoi(nextarg(option, argvp));
> +	new = palloc(option);
> +	new->flags = ex;
> +	return (new);
> +}
> +
> +int
>  f_flags(PLAN *plan, FTSENT *entry)
>  {
>  	u_long flags;
> Index: option.c
> ===================================================================
> RCS file: /home/ncvs/src/usr.bin/find/option.c,v
> retrieving revision 1.22
> diff -u -r1.22 option.c
> --- option.c	28 May 2004 17:17:15 -0000	1.22
> +++ option.c	16 Jul 2004 07:06:49 -0000
> @@ -76,6 +76,7 @@
>  	{ "-empty",	c_empty,	f_empty,	0 },
>  	{ "-exec",	c_exec,		f_exec,		0 },
>  	{ "-execdir",	c_exec,		f_exec,		F_EXECDIR },
> +	{ "-exit",	c_exit,		f_exit,		0 },
>  	{ "-false",	c_simple,	f_not,		0 },
>  	{ "-flags",	c_flags,	f_flags,	0 },
>  	{ "-follow",	c_follow,	f_always_true,	0 },
> -- 
> - Alfred Perlstein
> - Research Engineering Development Inc.
> - email: bright at mu.org cell: 408-480-4684

-- 
- Alfred Perlstein
- Research Engineering Development Inc.
- email: bright at mu.org cell: 408-480-4684


More information about the freebsd-hackers mailing list