Add -D option to specify exact format of date and time output with ls -l.

This commit is contained in:
Greg Lehey 2008-04-04 03:57:46 +00:00
parent 205e074f2c
commit 2269fa5765
4 changed files with 46 additions and 16 deletions

View File

@ -41,6 +41,7 @@
.Sh SYNOPSIS
.Nm
.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwx1
.Op Fl D Ar format
.Op Ar
.Sh DESCRIPTION
For each operand that names a
@ -88,6 +89,20 @@ where
is the numeric value of the character in octal.
.It Fl C
Force multi-column output; this is the default when output is to a terminal.
.It Fl D Ar format
When printing in the long
.Pq Fl l
format, use
.Ar format
to format the date and time output.
.Ar format
is a format string used by
.Xr strftime 3 .
Depending on the choice of format string, this may result in a
different number of columns in the output.
This option overrides the
.Fl T
option.
.It Fl F
Display a slash
.Pq Ql /
@ -146,12 +161,13 @@ Recursively list subdirectories encountered.
Sort by size (largest file first) before sorting the operands in
lexicographical order.
.It Fl T
When used with the
.Fl l
(lowercase letter
.Dq ell )
option, display complete time information for the file, including
When printing in the long
.Pq Fl l
format, display complete time information for the file, including
month, day, hour, minute, second, and year.
The
.Fl D
option gives even more control over the output format.
.It Fl U
Use time when file was created for sorting or printing.
.It Fl W
@ -325,7 +341,12 @@ hour file last modified, minute file last
modified, and the pathname.
.Pp
If the modification time of the file is more than 6 months
in the past or future, then the year of the last modification
in the past or future, and the
.Fl D
or
.Fl T
are not specified,
then the year of the last modification
is displayed in place of the hour and minute fields.
.Pp
If the owner or group names are not a known user or group name,
@ -657,6 +678,7 @@ specification.
.Xr getfacl 1 ,
.Xr sort 1 ,
.Xr xterm 1 ,
.Xr strftime 3 ,
.Xr termcap 5 ,
.Xr maclabel 7 ,
.Xr symlink 7 ,

View File

@ -125,10 +125,11 @@ static int f_reversesort; /* reverse whatever sort is used */
static int f_singlecol; /* use single column output */
int f_size; /* list size in short listing */
int f_slash; /* similar to f_type, but only for dirs */
int f_sortacross; /* sort across rows, not down columns */
int f_sortacross; /* sort across rows, not down columns */
int f_statustime; /* use time of last mode change */
static int f_stream; /* stream the output, separate with commas */
static int f_timesort; /* sort by time vice name */
char *f_timeformat; /* user-specified time format */
static int f_sizesort;
int f_type; /* add type character for non-regular files */
static int f_whiteout; /* show whiteout entries */
@ -179,7 +180,7 @@ main(int argc, char *argv[])
fts_options = FTS_PHYSICAL;
while ((ch = getopt(argc, argv,
"1ABCFGHILPRSTUWZabcdfghiklmnopqrstuwx")) != -1) {
"1ABCD:FGHILPRSTUWZabcdfghiklmnopqrstuwx")) != -1) {
switch (ch) {
/*
* The -1, -C, -x and -l options all override each other so
@ -198,6 +199,9 @@ main(int argc, char *argv[])
case 'C':
f_sortacross = f_longform = f_singlecol = 0;
break;
case 'D':
f_timeformat = optarg;
break;
case 'l':
f_longform = 1;
f_singlecol = 0;

View File

@ -50,8 +50,9 @@ extern int f_nonprint; /* show unprintables as ? */
extern int f_sectime; /* print the real time for all files */
extern int f_size; /* list size in short listing */
extern int f_slash; /* append a '/' if the file is a directory */
extern int f_sortacross; /* sort across rows, not down columns */
extern int f_sortacross; /* sort across rows, not down columns */
extern int f_statustime; /* use time of last mode change */
extern char *f_timeformat; /* user-specified time format */
extern int f_notabs; /* don't use tab-separated multi-col output */
extern int f_type; /* add type character for non-regular files */
#ifdef COLORLS

View File

@ -168,7 +168,7 @@ printlong(const DISPLAY *dp)
prevdev = sp->st_dev;
}
np = p->fts_pointer;
(void)printf("%s %*u %-*s %-*s ", buf, dp->s_nlink,
(void)printf("%s %*u %-*s %-*s ", buf, dp->s_nlink,
sp->st_nlink, dp->s_user, np->user, dp->s_group,
np->group);
if (f_flags)
@ -237,7 +237,7 @@ printstream(const DISPLAY *dp)
if (chcnt)
putchar('\n');
}
void
printcol(const DISPLAY *dp)
{
@ -378,17 +378,20 @@ printtime(time_t ftime)
now = time(NULL);
#define SIXMONTHS ((365 / 2) * 86400)
if (f_sectime)
if (f_timeformat) /* user specified format */
format = f_timeformat;
else if (f_sectime)
/* mmm dd hh:mm:ss yyyy || dd mmm hh:mm:ss yyyy */
format = d_first ? "%e %b %T %Y " : "%b %e %T %Y ";
format = d_first ? "%e %b %T %Y" : "%b %e %T %Y";
else if (ftime + SIXMONTHS > now && ftime < now + SIXMONTHS)
/* mmm dd hh:mm || dd mmm hh:mm */
format = d_first ? "%e %b %R " : "%b %e %R ";
format = d_first ? "%e %b %R" : "%b %e %R";
else
/* mmm dd yyyy || dd mmm yyyy */
format = d_first ? "%e %b %Y " : "%b %e %Y ";
format = d_first ? "%e %b %Y" : "%b %e %Y";
strftime(longstring, sizeof(longstring), format, localtime(&ftime));
fputs(longstring, stdout);
fputc(' ', stdout);
}
static int
@ -625,7 +628,7 @@ aclmode(char *buf, const FTSENT *p, int *haveacls)
snprintf(name, sizeof(name), "%s", p->fts_name);
else
snprintf(name, sizeof(name), "%s/%s",
p->fts_parent->fts_accpath, p->fts_name);
p->fts_parent->fts_accpath, p->fts_name);
/*
* We have no way to tell whether a symbolic link has an ACL since
* pathconf() and acl_get_file() both follow them. They also don't