Walk a directory/Recursively: Difference between revisions
Content added Content deleted
(Added Oz example.) |
(→{{header|OCaml}}: a little bit simpler) |
||
Line 444: | Line 444: | ||
let walk_directory_tree dir pattern = |
let walk_directory_tree dir pattern = |
||
let select str = Str.string_match (Str.regexp pattern) str 0 in |
let select str = Str.string_match (Str.regexp pattern) str 0 in |
||
let rec walk |
let rec walk acc = function |
||
| [] -> (acc) |
|||
⚫ | |||
| dir::tail -> |
|||
let contents = List.rev_map (Filename.concat dir) contents in |
|||
⚫ | |||
⚫ | |||
List. |
let contents = List.rev_map (Filename.concat dir) contents in |
||
⚫ | |||
match (stat f).st_kind with |
|||
List.fold_left (fun (dirs,files) f -> |
|||
match (stat f).st_kind with |
|||
| |
| S_REG -> (dirs, f::files) (* Regular file *) |
||
| S_DIR -> (f::dirs, files) (* Directory *) |
|||
| _ -> (dirs, files) |
|||
⚫ | |||
) ([],[]) contents |
|||
let matched = List.filter (select) files in |
|||
⚫ | |||
(* recursively walk into sub-directories: *) |
|||
let |
let matched = List.filter (select) files in |
||
walk (matched @ acc) (dirs @ tail) |
|||
let sub_result = walk dir in |
|||
List.rev_append sub_result acc |
|||
) matched dirs |
|||
in |
|||
(results) |
|||
in |
in |
||
walk dir |
walk [] [dir] |
||
;; |
;; |
||