Date: Tue, 4 Sep 2001 14:45:11 +0200 (CEST) From: Nils M Holm <nmh@t3x.org> To: FreeBSD-gnats-submit@freebsd.org Subject: bin/30309: New FIND(1) option Message-ID: <Pine.BSF.4.21.0109041442430.1819-100000@Oxygen2.UUCP>
next in thread | raw e-mail | index | archive | help
>Number: 30309
>Category: bin
>Synopsis: New FIND(1) option
>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: Tue Sep 04 05:50:01 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator: Nils M Holm
>Release: FreeBSD 4.2-RELEASE i386
>Organization:
>Environment:
FreeBSD 4.2-RELEASE
>Description:
I have added the -nt (newer than) option to FIND(1) which
allows to search for files with at least/at most a given age.
For example,
find . -nt 5h30m
will list files with an age of at least 5 hours and 30 minutes.
I use this option for cleaning up spool directories.
Man pages are updated.
>How-To-Repeat:
>Fix:
diff -u /usr/src/usr.bin/find.old/extern.h /usr/src/usr.bin/find/extern.h
--- /usr/src/usr.bin/find.old/extern.h Tue Sep 4 14:07:04 2001
+++ /usr/src/usr.bin/find/extern.h Tue Sep 4 14:09:51 2001
@@ -69,6 +69,7 @@
PLAN *c_newer __P((char *));
PLAN *c_nogroup __P((void));
PLAN *c_nouser __P((void));
+PLAN *c_nt __P((char *));
PLAN *c_path __P((char *));
PLAN *c_perm __P((char *));
PLAN *c_print __P((void));
diff -u /usr/src/usr.bin/find.old/find.1 /usr/src/usr.bin/find/find.1
--- /usr/src/usr.bin/find.old/find.1 Tue Sep 4 14:07:04 2001
+++ /usr/src/usr.bin/find/find.1 Tue Sep 4 14:32:23 2001
@@ -291,6 +291,12 @@
True if the file belongs to an unknown user.
.It Ic -nogroup
True if the file belongs to an unknown group.
+.It Ic -nt Ar difference
+True if the current file has a more recent last modification time than
+the current time minus the specified difference (the file is newer than
+the given amount of time). Time values may have suffixes: s=seconds,
+m=minutes, h=hours, D=days, W=weeks, M=months (30D), Y=years (365D).
+Suffixes may be mixed: -nt 5h30m.
.It Ic -path Ar pattern
True if the pathname being examined matches
.Ar pattern .
diff -u /usr/src/usr.bin/find.old/find.h /usr/src/usr.bin/find/find.h
--- /usr/src/usr.bin/find.old/find.h Tue Sep 4 14:07:04 2001
+++ /usr/src/usr.bin/find/find.h Tue Sep 4 14:08:41 2001
@@ -44,8 +44,8 @@
N_EXEC, N_EXECDIR, N_EXPR, N_FLAGS,
N_FOLLOW, N_FSTYPE, N_GROUP, N_INUM, N_LINKS, N_LS, N_MMIN,
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_NEWER, N_NOGROUP, N_NOT, N_NOUSER, N_NT, 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_MAXDEPTH, N_MINDEPTH
};
diff -u /usr/src/usr.bin/find.old/function.c /usr/src/usr.bin/find/function.c
--- /usr/src/usr.bin/find.old/function.c Tue Sep 4 14:07:04 2001
+++ /usr/src/usr.bin/find/function.c Tue Sep 4 14:26:29 2001
@@ -59,6 +59,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <ctype.h>
#include "find.h"
@@ -940,6 +941,75 @@
ftsoptions &= ~FTS_NOSTAT;
return (palloc(N_NOUSER, f_nouser));
+}
+
+/*
+ * -nt diff functions --
+ *
+ * True if the different between the current time and the file
+ * modification time is less than the specified difference.
+ */
+int
+f_nt(plan, entry)
+ PLAN *plan;
+ FTSENT *entry;
+{
+ extern time_t now;
+
+ return (entry->fts_statp->st_mtime > now - plan->t_data);
+}
+
+PLAN *
+c_nt(difftime)
+ char *difftime;
+{
+ PLAN *new;
+ time_t secs, a;
+ char *s;
+
+ ftsoptions &= ~FTS_NOSTAT;
+
+ secs = 0L;
+ a = 0L;
+ for (s = difftime; *s; s++) {
+ if (isdigit(*s)) {
+ a = a*10 + *s-'0';
+ }
+ else if (*s == 's') { /* seconds */
+ secs += a;
+ a = 0L;
+ }
+ else if (*s == 'm') { /* minutes */
+ secs += a*60L;
+ a = 0L;
+ }
+ else if (*s == 'h') { /* hours */
+ secs += a*3600L;
+ a = 0L;
+ }
+ else if (*s == 'D') { /* days */
+ secs += a*86400L;
+ a = 0L;
+ }
+ else if (*s == 'W') { /* weeks */
+ secs += a*604800L;
+ a = 0L;
+ }
+ else if (*s == 'M') { /* months (d*30)*/
+ secs += a*2592000L;
+ a = 0L;
+ }
+ else if (*s == 'Y') { /* years (d*365)*/
+ secs += a*31536000L;
+ a = 0L;
+ }
+ else {
+ errx(1, "-nt: bad difference: %s", difftime);
+ }
+ }
+ new = palloc(N_NT, f_nt);
+ new->t_data = secs;
+ return (new);
}
/*
diff -u /usr/src/usr.bin/find.old/option.c /usr/src/usr.bin/find/option.c
--- /usr/src/usr.bin/find.old/option.c Tue Sep 4 14:07:04 2001
+++ /usr/src/usr.bin/find/option.c Tue Sep 4 14:09:28 2001
@@ -92,6 +92,7 @@
{ "-newer", N_NEWER, c_newer, O_ARGV },
{ "-nogroup", N_NOGROUP, c_nogroup, O_ZERO },
{ "-nouser", N_NOUSER, c_nouser, O_ZERO },
+ { "-nt", N_NT, c_nt , O_ARGV },
{ "-o", N_OR, c_or, O_ZERO },
{ "-ok", N_OK, c_exec, O_ARGVP },
{ "-or", N_OR, c_or, O_ZERO },
>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?Pine.BSF.4.21.0109041442430.1819-100000>
