diff options
-rwxr-xr-x | tests/find.test | 7 | ||||
-rw-r--r-- | toys/posix/find.c | 10 |
2 files changed, 16 insertions, 1 deletions
diff --git a/tests/find.test b/tests/find.test index 1f59149b..9129a605 100755 --- a/tests/find.test +++ b/tests/find.test @@ -101,6 +101,13 @@ testing "-iwholename glob" "find dir -iwholename 'dIr*E'" "dir/file\n" "" "" testing "-printf" "find dir -name file -printf '%f %p %P %s'" \ "file dir/file file 0" "" "" testing "-printf .N" "find dir -name file -printf %.2f" "fi" "" "" +# findutils find supports C letter escapes and \0 octal, but not \x or \u. +testing "-printf escapes" \ + "find dir -name file -printf '\0 \007 \t \079' | xxd -p" \ + "0020072009200739\n" "" "" +# findutils find treats \c as "no more output from this -printf", not "no more +# output from find". +testing "-printf \\c escape" "find dir -name f* -printf 'x\cy'" "xx" "" "" # No error message for a dangling link. ln -s does-not-exist dir/dangler diff --git a/toys/posix/find.c b/toys/posix/find.c index 3317448a..64270c00 100644 --- a/toys/posix/find.c +++ b/toys/posix/find.c @@ -569,7 +569,15 @@ static int do_find(struct dirtree *new) if (check) for (fmt = ss[1]; *fmt; fmt++) { // Print the parts that aren't escapes if (*fmt == '\\') { - if (!(ch = unescape(*++fmt))) error_exit("bad \\%c", *fmt); + int slash = *++fmt, n = unescape(slash); + + if (n) ch = n; + else if (slash=='c') break; + else if (slash=='0') { + ch = 0; + while (*fmt>='0' && *fmt<='7' && n++<3) ch=(ch*8)+*(fmt++)-'0'; + --fmt; + } else error_exit("bad \\%c", *fmt); putchar(ch); } else if (*fmt != '%') putchar(*fmt); else if (*++fmt == '%') putchar('%'); |