let rm ?(force=Force) ?(recurse=false) fln_lst =
    let cfile = (And(Custom (doit force),Or(Not(Is_dir),Is_link)))
    in
    let cdir  = (And(Custom (doit force),Is_dir))
    in
    let rmdir () fln =
      try 
          Unix.rmdir fln
      with Unix.Unix_error(Unix.ENOTEMPTY,_,_) ->
        raise (RmDirNotEmpty fln)
    in
    let rmfile () fln =
        Unix.unlink fln
    in
    let rmfull fln = 
      find cfile fln rmfile ();
      let set_dir = 
        find cdir fln 
        ( fun set fln -> SetFilename.add fln set) SetFilename.empty
      in
      List.iter (rmdir ()) (SetFilename.elements set_dir)
    in
    if recurse then
      List.iter rmfull fln_lst 
    else
      begin
      List.iter (rmfile ()) (filter cfile fln_lst);
      List.iter (rmdir  ()) (filter cdir fln_lst)
      end