find: Add -readable, -writable & -executable options

Reviewed by:	jhb, Mina Galić
Pull Request:	https://github.com/freebsd/freebsd-src/pull/1080
This commit is contained in:
Ricardo Branco 2024-01-21 20:53:05 +01:00 committed by John Baldwin
parent 91f78c32be
commit e4b646ce16
4 changed files with 64 additions and 1 deletions

View File

@ -86,6 +86,7 @@ exec_f f_delete;
exec_f f_depth; exec_f f_depth;
exec_f f_empty; exec_f f_empty;
exec_f f_exec; exec_f f_exec;
exec_f f_executable;
exec_f f_expr; exec_f f_expr;
exec_f f_false; exec_f f_false;
exec_f f_flags; exec_f f_flags;
@ -107,11 +108,13 @@ exec_f f_print;
exec_f f_print0; exec_f f_print0;
exec_f f_prune; exec_f f_prune;
exec_f f_quit; exec_f f_quit;
exec_f f_readable;
exec_f f_regex; exec_f f_regex;
exec_f f_size; exec_f f_size;
exec_f f_sparse; exec_f f_sparse;
exec_f f_type; exec_f f_type;
exec_f f_user; exec_f f_user;
exec_f f_writable;
extern int ftsoptions, ignore_readdir_race, isdepth, isoutput; extern int ftsoptions, ignore_readdir_race, isdepth, isoutput;
extern int issort, isxargs; extern int issort, isxargs;

View File

@ -28,7 +28,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" SUCH DAMAGE.
.\" .\"
.Dd January 15, 2024 .Dd January 21, 2024
.Dt FIND 1 .Dt FIND 1
.Os .Os
.Sh NAME .Sh NAME
@ -465,6 +465,12 @@ if at least one invocation of
returns a non-zero exit status, returns a non-zero exit status,
.Nm .Nm
will return a non-zero exit status. will return a non-zero exit status.
.It Ic -executable
Matches files which are executable by the current user.
This test makes use of the
.Xr access 2
system call, and so can be fooled by NFS servers which do UID mapping (or root-squashing).
This is a GNU find extension.
.It Ic -flags Oo Cm - Ns | Ns Cm + Oc Ns Ar flags , Ns Ar notflags .It Ic -flags Oo Cm - Ns | Ns Cm + Oc Ns Ar flags , Ns Ar notflags
The flags are specified using symbolic names (see The flags are specified using symbolic names (see
.Xr chflags 1 ) . .Xr chflags 1 ) .
@ -829,6 +835,12 @@ option was specified.
Causes Causes
.Nm .Nm
to terminate immediately. to terminate immediately.
.It Ic -readable
Matches files which are readable by the current user.
This test makes use of the
.Xr access 2
system call, and so can be fooled by NFS servers which do UID mapping (or root-squashing).
This is a GNU find extension.
.It Ic -regex Ar pattern .It Ic -regex Ar pattern
True if the whole path of the file matches True if the whole path of the file matches
.Ar pattern .Ar pattern
@ -925,6 +937,12 @@ is treated as a user ID.
The same thing as The same thing as
.Ic -path , .Ic -path ,
for GNU find compatibility. for GNU find compatibility.
.It Ic -writable
Matches files which are writable by the current user.
This test makes use of the
.Xr access 2
system call, and so can be fooled by NFS servers which do UID mapping (or root-squashing).
This is a GNU find extension.
.El .El
.Sh OPERATORS .Sh OPERATORS
The primaries may be combined using the following operators. The primaries may be combined using the following operators.

View File

@ -1808,3 +1808,42 @@ f_quit(PLAN *plan __unused, FTSENT *entry __unused)
} }
/* c_quit == c_simple */ /* c_quit == c_simple */
/*
* -readable
*
* File is readable
*/
int
f_readable(PLAN *plan __unused, FTSENT *entry)
{
return (access(entry->fts_path, R_OK) == 0);
}
/* c_readable == c_simple */
/*
* -writable
*
* File is writable
*/
int
f_writable(PLAN *plan __unused, FTSENT *entry)
{
return (access(entry->fts_path, W_OK) == 0);
}
/* c_writable == c_simple */
/*
* -executable
*
* File is executable
*/
int
f_executable(PLAN *plan __unused, FTSENT *entry)
{
return (access(entry->fts_path, X_OK) == 0);
}
/* c_executable == c_simple */

View File

@ -75,6 +75,7 @@ static OPTION const options[] = {
{ "-empty", c_empty, f_empty, 0 }, { "-empty", c_empty, f_empty, 0 },
{ "-exec", c_exec, f_exec, 0 }, { "-exec", c_exec, f_exec, 0 },
{ "-execdir", c_exec, f_exec, F_EXECDIR }, { "-execdir", c_exec, f_exec, F_EXECDIR },
{ "-executable", c_simple, f_executable, 0 },
{ "-false", c_simple, f_false, 0 }, { "-false", c_simple, f_false, 0 },
#if HAVE_STRUCT_STAT_ST_FLAGS #if HAVE_STRUCT_STAT_ST_FLAGS
{ "-flags", c_flags, f_flags, 0 }, { "-flags", c_flags, f_flags, 0 },
@ -149,6 +150,7 @@ static OPTION const options[] = {
// -printf // -printf
{ "-prune", c_simple, f_prune, 0 }, { "-prune", c_simple, f_prune, 0 },
{ "-quit", c_simple, f_quit, 0 }, { "-quit", c_simple, f_quit, 0 },
{ "-readable", c_simple, f_readable, 0 },
{ "-regex", c_regex, f_regex, 0 }, { "-regex", c_regex, f_regex, 0 },
{ "-samefile", c_samefile, f_inum, 0 }, { "-samefile", c_samefile, f_inum, 0 },
{ "-size", c_size, f_size, 0 }, { "-size", c_size, f_size, 0 },
@ -158,6 +160,7 @@ static OPTION const options[] = {
{ "-uid", c_user, f_user, 0 }, { "-uid", c_user, f_user, 0 },
{ "-user", c_user, f_user, 0 }, { "-user", c_user, f_user, 0 },
{ "-wholename", c_name, f_path, 0 }, { "-wholename", c_name, f_path, 0 },
{ "-writable", c_simple, f_writable, 0 },
{ "-xdev", c_xdev, f_always_true, 0 }, { "-xdev", c_xdev, f_always_true, 0 },
// -xtype // -xtype
}; };