diff options
-rwxr-xr-x | tests/find.test | 2 | ||||
-rw-r--r-- | 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) |