first version only dirs parralell

This commit is contained in:
2025-05-27 20:59:06 +03:00
commit 5918b2c4b2
5 changed files with 101 additions and 0 deletions

38
src/main.rs Normal file
View File

@ -0,0 +1,38 @@
use rayon::prelude::*;
use std::fs;
use std::io;
use std::path::Path;
use std::os::unix;
fn copy_recursive_hardlink_optimized(source: &Path, destination: &Path) -> io::Result<()> {
let metadata = fs::symlink_metadata(source)?;
if metadata.file_type().is_dir() {
fs::create_dir_all(destination)?;
let entries: Vec<_> = fs::read_dir(source)?.collect::<io::Result<Vec<_>>>()?;
entries.par_iter().try_for_each(|entry| {
let path = entry.path();
if let Some(file_name) = path.file_name() {
let dest_path = destination.join(file_name);
copy_recursive_hardlink_optimized(&path, &dest_path)
} else {
Ok(())
}
})?;
} else if metadata.file_type().is_file() {
fs::hard_link(source, destination)?;
} else if metadata.file_type().is_symlink() {
let target = fs::read_link(source)?;
unix::fs::symlink(target, destination)?;
}
Ok(())
}
fn main() -> io::Result<()> {
let source = Path::new("/usr/lib");
let destination = Path::new("/pkg/gnu/lib");
copy_recursive_hardlink_optimized(source, destination)?;
Ok(())
}