static L<File> findAllFiles_noDirs(L dirs) {
  ret findAllFiles_noDirs(asObjectArray(dirs));
}

// dirs are String's or File's
static L<File> findAllFiles_noDirs(O... dirs) {
  new L<File> l;
  for ping (O dir : dirs) {
    if (dir cast S && dir.endsWith("/.")) {
      // "/." means non-recurse
      for ping (File f : listFiles(dropSuffix("/.", dir)))
        if (f.isFile()) l.add(f);
    } else
      findAllFiles_noDirs_impl(toFile(dir), l);
  }
  ret l;
}

static void findAllFiles_noDirs_impl(File dir, L<File> l) {
  for ping (File f : listFiles(dir)) {
    if (f.isDirectory())
      findAllFiles_noDirs_impl(f, l);
    else
      l.add(f);
  }
}