From 70a55cf954ecabb858a12b754f4547bcaf78dc2d Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Wed, 29 Jul 2020 11:39:10 -0700 Subject: find: support -type a,b,c. Fixes #227. --- tests/find.test | 2 ++ toys/posix/find.c | 17 +++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/tests/find.test b/tests/find.test index 17d72fd3..a770f366 100755 --- a/tests/find.test +++ b/tests/find.test @@ -38,6 +38,8 @@ testing "( -type p -o -type d ) -type p" \ testing "-type l -o -type d -type p -o -type f" \ "find dir -type l -o -type d -type p -o -type f | sort" \ "dir/file\ndir/link\n" "" "" +testing "-type l,f" \ + "find dir -type l,f | sort" "dir/file\ndir/link\n" "" "" # Testing short-circuit evaluations diff --git a/toys/posix/find.c b/toys/posix/find.c index 9b688d46..47cefb78 100644 --- a/toys/posix/find.c +++ b/toys/posix/find.c @@ -398,10 +398,19 @@ static int do_find(struct dirtree *new) } else if (!strcmp(s, "type")) { if (check) { int types[] = {S_IFBLK, S_IFCHR, S_IFDIR, S_IFLNK, S_IFIFO, - S_IFREG, S_IFSOCK}, i = stridx("bcdlpfs", *ss[1]); - - if (i<0) error_exit("bad -type '%c'", *ss[1]); - if ((new->st.st_mode & S_IFMT) != types[i]) test = 0; + S_IFREG, S_IFSOCK}, i, match = 0; + char *t = ss[1]; + + for (; *t; t++) { + if (*t == ',') continue; + i = stridx("bcdlpfs", *t); + if (i<0) error_exit("bad -type '%c'", *t); + if ((new->st.st_mode & S_IFMT) == types[i]) { + match = 1; + break; + } + } + if (!match) test = 0; } } else if (strchr("acm", *s) -- cgit v1.2.3