如何用Rust在Linux下清空目录内容而非删除目录?
解决Rust清空目录内容的两种方法
问题原因
你用Command直接执行rm -rf backup/nosva/credentials/*失败,是因为shell的通配符*需要由shell解析展开,而Rust的Command默认会直接调用rm命令,把*当作字面文件名,系统自然找不到对应的文件。
方案一:通过Shell执行命令
让bash来处理通配符,把整个命令作为参数传给bash的-c选项:
use std::process::Command; Command::new("bash") .arg("-c") .arg("rm -rf backup/nosva/credentials/*") .spawn() .expect("rm command failed to start");
这种方式和你在终端执行命令的逻辑完全一致,bash会自动展开*为目录下的所有内容。
方案二:纯Rust标准库实现(跨平台)
如果需要跨平台支持,或者不想依赖shell,可以手动遍历目录内容并删除,保留原目录:
use std::fs; use std::path::Path; fn empty_dir<P: AsRef<Path>>(path: P) -> std::io::Result<()> { let target_dir = path.as_ref(); // 遍历目录下的所有条目 for entry in fs::read_dir(target_dir)? { let entry = entry?; let entry_path = entry.path(); if entry_path.is_dir() { // 递归删除子目录及其内容 fs::remove_dir_all(entry_path)?; } else { // 删除单个文件 fs::remove_file(entry_path)?; } } Ok(()) } // 调用示例 empty_dir("backup/nosva/credentials").expect("Failed to empty directory");
这个函数会遍历目标目录下的所有文件和子目录,逐个删除,但不会删除目标目录本身,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Erty Desu
相关产品推荐
相关产品推荐

