Rust 递归拷贝文件并使用正则表达式过滤文件名
使用 Rust 实现递归拷贝文件并根据文件名正则过滤
以下是一个使用 Rust 实现的递归拷贝文件的方法,可以根据文件名正则过滤掉不想要的文件:rustuse std::fs;use std::io::{self, ErrorKind};use regex::Regex;
fn copy_file(src: &str, dest: &str, regex: &Regex) -> io::Result<()> { let metadata = fs::metadata(src)?; let file_type = metadata.file_type();
if file_type.is_dir() { // 处理目录 fs::create_dir_all(dest)?; for entry in fs::read_dir(src)? { let entry = entry?; let src_path = entry.path(); let file_name = entry.file_name().to_string_lossy();
if regex.is_match(&file_name) { let dest_path = format!('{}/{'}', dest, file_name); copy_file(&src_path.to_string_lossy(), &dest_path, regex)?; } } } else { // 处理文件 if regex.is_match(src) { fs::copy(src, dest)?; } }
Ok(())}
该方法接收三个参数:源文件路径、目标文件路径和一个正则表达式,用于过滤文件名。如果源文件是目录,则递归地处理该目录下的所有文件和子目录;如果源文件是普通文件,则直接复制到目标文件。
例如,如果要将目录/home/user/source中所有以.txt结尾的文件拷贝到目录/home/user/dest中,可以这样调用该方法:rustuse regex::Regex;
let src = '/home/user/source';let dest = '/home/user/dest';let regex = Regex::new(r'.txt$').unwrap();
copy_file(src, dest, ®ex)?;
使用方法:
- 确保已安装 Rust 语言环境。2. 将代码保存为
.rs文件。3. 使用cargo build编译代码。4. 运行可执行文件,并传入源路径、目标路径和正则表达式作为参数。
注意:
- 正则表达式需要使用
r前缀,表示原始字符串。- 目标路径的目录需要提前存在,否则程序会报错。- 程序会覆盖目标路径中已存在的文件。
示例:
假设源路径为 /home/user/source,目标路径为 /home/user/dest,正则表达式为 .txt$,则运行程序后,所有源路径中以 .txt 结尾的文件会被复制到目标路径中。
原文地址: https://www.cveoy.top/t/topic/n4RU 著作权归作者所有。请勿转载和采集!