Add -O (only leaf files) and -P (print full path), from tls@

This commit is contained in:
christos 2014-02-20 18:56:36 +00:00
parent ebf02f5265
commit 0c47a5c376
4 changed files with 71 additions and 21 deletions

View File

@ -1,4 +1,4 @@
.\" $NetBSD: ls.1,v 1.72 2012/11/20 12:37:29 abs Exp $ .\" $NetBSD: ls.1,v 1.73 2014/02/20 18:56:36 christos Exp $
.\" .\"
.\" Copyright (c) 1980, 1990, 1991, 1993, 1994 .\" Copyright (c) 1980, 1990, 1991, 1993, 1994
.\" The Regents of the University of California. All rights reserved. .\" The Regents of the University of California. All rights reserved.
@ -32,7 +32,7 @@
.\" .\"
.\" @(#)ls.1 8.7 (Berkeley) 7/29/94 .\" @(#)ls.1 8.7 (Berkeley) 7/29/94
.\" .\"
.Dd November 20, 2012 .Dd February 20, 2014
.Dt LS 1 .Dt LS 1
.Os .Os
.Sh NAME .Sh NAME
@ -40,7 +40,7 @@
.Nd list directory contents .Nd list directory contents
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm .Nm
.Op Fl 1AaBbCcdFfghikLlMmnopqRrSsTtuWwx .Op Fl 1AaBbCcdFfghikLlMmnOoPpqRrSsTtuWwx
.Op Ar .Op Ar
.Sh DESCRIPTION .Sh DESCRIPTION
For each For each
@ -183,6 +183,8 @@ The same as
except that except that
the owner and group IDs are displayed numerically rather than converting the owner and group IDs are displayed numerically rather than converting
to a owner or group name. to a owner or group name.
.It Fl O
Output only leaf files (not directories), eliding other ls output.
.It Fl o .It Fl o
Include the file flags in a long Include the file flags in a long
.Pq Fl l .Pq Fl l
@ -193,6 +195,8 @@ is displayed.
(See (See
.Xr chflags 1 .Xr chflags 1
for a list of possible flags and their meanings.) for a list of possible flags and their meanings.)
.It Fl P
Print the full pathname for each file.
.It Fl p .It Fl p
Display a slash Display a slash
.Pq Sq \&/ .Pq Sq \&/

View File

@ -1,4 +1,4 @@
/* $NetBSD: ls.c,v 1.70 2012/11/20 12:37:29 abs Exp $ */ /* $NetBSD: ls.c,v 1.71 2014/02/20 18:56:36 christos Exp $ */
/* /*
* Copyright (c) 1989, 1993, 1994 * Copyright (c) 1989, 1993, 1994
@ -42,7 +42,7 @@ __COPYRIGHT("@(#) Copyright (c) 1989, 1993, 1994\
#if 0 #if 0
static char sccsid[] = "@(#)ls.c 8.7 (Berkeley) 8/5/94"; static char sccsid[] = "@(#)ls.c 8.7 (Berkeley) 8/5/94";
#else #else
__RCSID("$NetBSD: ls.c,v 1.70 2012/11/20 12:37:29 abs Exp $"); __RCSID("$NetBSD: ls.c,v 1.71 2014/02/20 18:56:36 christos Exp $");
#endif #endif
#endif /* not lint */ #endif /* not lint */
@ -111,6 +111,8 @@ int f_stream; /* stream format */
int f_type; /* add type character for non-regular files */ int f_type; /* add type character for non-regular files */
int f_typedir; /* add type character for directories */ int f_typedir; /* add type character for directories */
int f_whiteout; /* show whiteout entries */ int f_whiteout; /* show whiteout entries */
int f_fullpath; /* print full pathname, not filename */
int f_leafonly; /* when recursing, print leaf names only */
__dead static void __dead static void
usage(void) usage(void)
@ -149,7 +151,7 @@ ls_main(int argc, char *argv[])
f_listdot = 1; f_listdot = 1;
fts_options = FTS_PHYSICAL; fts_options = FTS_PHYSICAL;
while ((ch = getopt(argc, argv, "1ABCFLMRSTWabcdfghiklmnopqrstuwx")) != -1) { while ((ch = getopt(argc, argv, "1ABCFLMOPRSTWabcdfghiklmnopqrstuwx")) != -1) {
switch (ch) { switch (ch) {
/* /*
* The -1, -C, -l, -m and -x options all override each other so * The -1, -C, -l, -m and -x options all override each other so
@ -253,9 +255,15 @@ ls_main(int argc, char *argv[])
f_longform = 1; f_longform = 1;
f_column = f_columnacross = f_singlecol = f_stream = 0; f_column = f_columnacross = f_singlecol = f_stream = 0;
break; break;
case 'O':
f_leafonly = 1;
break;
case 'o': case 'o':
f_flags = 1; f_flags = 1;
break; break;
case 'P':
f_fullpath = 1;
break;
case 'p': case 'p':
f_typedir = 1; f_typedir = 1;
break; break;
@ -446,12 +454,14 @@ traverse(int argc, char *argv[], int options)
* a separator. If multiple arguments, precede each * a separator. If multiple arguments, precede each
* directory with its name. * directory with its name.
*/ */
if (!f_leafonly) {
if (output) if (output)
(void)printf("\n%s:\n", p->fts_path); (void)printf("\n%s:\n", p->fts_path);
else if (argc > 1) { else if (argc > 1) {
(void)printf("%s:\n", p->fts_path); (void)printf("%s:\n", p->fts_path);
output = 1; output = 1;
} }
}
chp = fts_children(ftsp, ch_options); chp = fts_children(ftsp, ch_options);
display(p, chp); display(p, chp);

View File

@ -1,4 +1,4 @@
/* $NetBSD: ls.h,v 1.18 2011/03/15 03:52:38 erh Exp $ */ /* $NetBSD: ls.h,v 1.19 2014/02/20 18:56:36 christos Exp $ */
/* /*
* Copyright (c) 1989, 1993 * Copyright (c) 1989, 1993
@ -53,6 +53,8 @@ extern int f_statustime; /* use time of last mode change */
extern int f_type; /* add type character for non-regular files */ extern int f_type; /* add type character for non-regular files */
extern int f_typedir; /* add type character for directories */ extern int f_typedir; /* add type character for directories */
extern int f_nonprint; /* show unprintables as ? */ extern int f_nonprint; /* show unprintables as ? */
extern int f_fullpath; /* print full pathname, not filename */
extern int f_leafonly; /* when recursing, print leaf names only */
typedef struct { typedef struct {
FTSENT *list; FTSENT *list;

View File

@ -1,4 +1,4 @@
/* $NetBSD: print.c,v 1.52 2013/05/02 22:43:55 zafer Exp $ */ /* $NetBSD: print.c,v 1.53 2014/02/20 18:56:36 christos Exp $ */
/* /*
* Copyright (c) 1989, 1993, 1994 * Copyright (c) 1989, 1993, 1994
@ -37,7 +37,7 @@
#if 0 #if 0
static char sccsid[] = "@(#)print.c 8.5 (Berkeley) 7/28/94"; static char sccsid[] = "@(#)print.c 8.5 (Berkeley) 7/28/94";
#else #else
__RCSID("$NetBSD: print.c,v 1.52 2013/05/02 22:43:55 zafer Exp $"); __RCSID("$NetBSD: print.c,v 1.53 2014/02/20 18:56:36 christos Exp $");
#endif #endif
#endif /* not lint */ #endif /* not lint */
@ -72,6 +72,39 @@ static time_t now;
#define IS_NOPRINT(p) ((p)->fts_number == NO_PRINT) #define IS_NOPRINT(p) ((p)->fts_number == NO_PRINT)
static int
safe_printpath(const FTSENT *p) {
int chcnt;
if (f_fullpath) {
chcnt = safe_print(p->fts_path);
chcnt += safe_print("/");
} else
chcnt = 0;
return chcnt + safe_print(p->fts_name);
}
static int
printescapedpath(const FTSENT *p) {
int chcnt;
if (f_fullpath) {
chcnt = printescaped(p->fts_path);
chcnt += printescaped("/");
} else
chcnt = 0;
return chcnt + printescaped(p->fts_name);
}
static int
printpath(const FTSENT *p) {
if (f_fullpath)
return printf("%s/%s", p->fts_path, p->fts_name);
else
return printf("%s", p->fts_path);
}
void void
printscol(DISPLAY *dp) printscol(DISPLAY *dp)
{ {
@ -95,6 +128,7 @@ printlong(DISPLAY *dp)
now = time(NULL); now = time(NULL);
if (!f_leafonly)
printtotal(dp); /* "total: %u\n" */ printtotal(dp); /* "total: %u\n" */
for (p = dp->list; p; p = p->fts_link) { for (p = dp->list; p; p = p->fts_link) {
@ -151,11 +185,11 @@ printlong(DISPLAY *dp)
else else
printtime(sp->st_mtime); printtime(sp->st_mtime);
if (f_octal || f_octal_escape) if (f_octal || f_octal_escape)
(void)safe_print(p->fts_name); (void)safe_printpath(p);
else if (f_nonprint) else if (f_nonprint)
(void)printescaped(p->fts_name); (void)printescapedpath(p);
else else
(void)printf("%s", p->fts_name); (void)printpath(p);
if (f_type || (f_typedir && S_ISDIR(sp->st_mode))) if (f_type || (f_typedir && S_ISDIR(sp->st_mode)))
(void)printtype(sp->st_mode); (void)printtype(sp->st_mode);
@ -346,11 +380,11 @@ printaname(FTSENT *p, int inodefield, int sizefield)
} }
} }
if (f_octal || f_octal_escape) if (f_octal || f_octal_escape)
chcnt += safe_print(p->fts_name); chcnt += safe_printpath(p);
else if (f_nonprint) else if (f_nonprint)
chcnt += printescaped(p->fts_name); chcnt += printescapedpath(p);
else else
chcnt += printf("%s", p->fts_name); chcnt += printpath(p);
if (f_type || (f_typedir && S_ISDIR(sp->st_mode))) if (f_type || (f_typedir && S_ISDIR(sp->st_mode)))
chcnt += printtype(sp->st_mode); chcnt += printtype(sp->st_mode);
return (chcnt); return (chcnt);