touch: Add support for -a and -m
Update the manpage.
This commit is contained in:
parent
8b623f8593
commit
45c54bff0b
56
touch.1
56
touch.1
|
@ -1,25 +1,31 @@
|
|||
.TH TOUCH 1 sbase\-VERSION
|
||||
.SH NAME
|
||||
touch \- set files' timestamps
|
||||
.SH SYNOPSIS
|
||||
.B touch
|
||||
.RB [ \-c ]
|
||||
.RB [ \-t
|
||||
.IR time ]
|
||||
.RI [ file ...]
|
||||
.SH DESCRIPTION
|
||||
.B touch
|
||||
sets the given files' modification time to the current time. If a file does not
|
||||
exist it is created.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \-c
|
||||
do not create files if they do not exist.
|
||||
.TP
|
||||
.BI \-t " time"
|
||||
sets the files' modification time to
|
||||
.IR time ,
|
||||
given as the number of seconds since the Unix epoch.
|
||||
.SH SEE ALSO
|
||||
.IR utime (2),
|
||||
.IR creat (2)
|
||||
.Dd January 20, 2014
|
||||
.Dt TOUCH 1 sbase\-VERSION
|
||||
.Sh NAME
|
||||
.Nm touch
|
||||
.Nd set file timestamps
|
||||
.Sh SYNOPSIS
|
||||
.Nm touch
|
||||
.Op Fl acm
|
||||
.Op Fl t Ar stamp
|
||||
.Ar file ...
|
||||
.Sh DESCRIPTION
|
||||
.Nm
|
||||
sets the access and modification times of files to the current time of day. If the file
|
||||
doesn't exist, it is created with the default permissions.
|
||||
.Sh OPTIONS
|
||||
.Bl -tag -width Ds
|
||||
.It Fl a
|
||||
Set the access time of the file.
|
||||
.It Fl c
|
||||
Do not create the file it it does not exist. The exit
|
||||
status is not affected.
|
||||
.It Fl m
|
||||
Change the modification time of the file.
|
||||
.It Fl t Ar stamp
|
||||
Set the timestamp to be used with
|
||||
.Op Fl am .
|
||||
The format of the timestamp is simply the number of seconds
|
||||
since Jan 1, 1970. This specification of time does not conform
|
||||
to POSIX.
|
||||
.Sh SEE ALSO
|
||||
.Xr date 1
|
||||
|
|
43
touch.c
43
touch.c
|
@ -11,13 +11,15 @@
|
|||
|
||||
static void touch(const char *);
|
||||
|
||||
static int cflag = 0;
|
||||
static int aflag;
|
||||
static int cflag;
|
||||
static int mflag;
|
||||
static time_t t;
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
{
|
||||
eprintf("usage: %s [-c] [-t stamp] file...\n", argv0);
|
||||
eprintf("usage: %s [-acm] [-t stamp] file ...\n", argv0);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -26,9 +28,15 @@ main(int argc, char *argv[])
|
|||
t = time(NULL);
|
||||
|
||||
ARGBEGIN {
|
||||
case 'a':
|
||||
aflag = 1;
|
||||
break;
|
||||
case 'c':
|
||||
cflag = 1;
|
||||
break;
|
||||
case 'm':
|
||||
mflag = 1;
|
||||
break;
|
||||
case 't':
|
||||
t = estrtol(EARGF(usage()), 0);
|
||||
break;
|
||||
|
@ -46,26 +54,29 @@ main(int argc, char *argv[])
|
|||
}
|
||||
|
||||
static void
|
||||
touch(const char *str)
|
||||
touch(const char *file)
|
||||
{
|
||||
int fd;
|
||||
struct stat st;
|
||||
struct utimbuf ut;
|
||||
int r;
|
||||
|
||||
if (stat(str, &st) == 0) {
|
||||
ut.actime = st.st_atime;
|
||||
ut.modtime = t;
|
||||
if (utime(str, &ut) < 0)
|
||||
eprintf("utime %s:", str);
|
||||
if ((r = stat(file, &st)) < 0) {
|
||||
if (errno != ENOENT)
|
||||
eprintf("stat %s:", file);
|
||||
if (cflag)
|
||||
return;
|
||||
} else if (r == 0) {
|
||||
ut.actime = aflag ? t : st.st_atime;
|
||||
ut.modtime = mflag ? t : st.st_mtime;
|
||||
if (utime(file, &ut) < 0)
|
||||
eprintf("utime %s:", file);
|
||||
return;
|
||||
}
|
||||
else if (errno != ENOENT)
|
||||
eprintf("stat %s:", str);
|
||||
else if (cflag)
|
||||
return;
|
||||
if ((fd = open(str, O_CREAT|O_EXCL,
|
||||
S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0)
|
||||
eprintf("open %s:", str);
|
||||
|
||||
if ((fd = open(file, O_CREAT | O_EXCL, 0644)) < 0)
|
||||
eprintf("open %s:", file);
|
||||
close(fd);
|
||||
touch(str);
|
||||
|
||||
touch(file);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user