use std::path::{Path, PathBuf}; fn main() { let paths = [ Path::new("/home/user1/tmp/coverage/test"), Path::new("/home/user1/tmp/covert/operator"), Path::new("/home/user1/tmp/coven/members"), ]; match common_path(&paths) { Some(p) => println!("The common path is: {:#?}", p), None => println!("No common paths found"), } } fn common_path(paths: I) -> Option where I: IntoIterator, P: AsRef, { let mut iter = paths.into_iter(); let mut ret = iter.next()?.as_ref().to_path_buf(); for path in iter { if let Some(r) = common(ret, path.as_ref()) { ret = r; } else { return None; } } Some(ret) } fn common, B: AsRef>(a: A, b: B) -> Option { let a = a.as_ref().components(); let b = b.as_ref().components(); let mut ret = PathBuf::new(); let mut found = false; for (one, two) in a.zip(b) { if one == two { ret.push(one); found = true; } else { break; } } if found { Some(ret) } else { None } }