Rust5个实用的小脚本
Rust 虽然常被认为是一个“系统级”或“高性能”语言,但它也非常适合写一些实用的小脚本,比如:
- 批量重命名文件
- 解析日志文件并提取信息
- 下载网页内容或图片
- 简易的文件整理/备份工具
- CSV/JSON 处理工具
- 定时提醒或通知
- 系统信息查询(如磁盘、内存)
这些脚本通常用 Rust 写出来后:
- 比 Shell / Python 脚本更快、更安全
- 没有解释器依赖,编译后可直接运行
- 适合自动化、部署到服务器等场景
✅ 推荐几个实用、简单、适合学习的 Rust 小脚本例子
下面我给你介绍 5 个实用且代码简洁的 Rust 脚本示例,每个都附带用途说明 + 核心代码思路 + 如何运行,让你可以快速学以致用 👇
📌 1. 批量重命名文件(给文件加前缀/后缀)
🎯 用途:
给某个文件夹中的所有 .jpg
或 .png
图片添加前缀,比如 vacation_
,变成 vacation_1.jpg
。
💡 Rust 优势:
比 Bash 更安全,跨平台,避免误操作。
📦 依赖(可选):
使用标准库即可,无需第三方 crate。
🧠 核心思路:
- 遍历目录中的文件
- 匹配特定扩展名(如
.jpg
,.png
) - 构造新文件名并执行
std::fs::rename
🛠️ 简化代码思路(伪代码/关键结构):
use std::fs;
use std::path::Path;
fn main() {
let dir = "./images"; // 图片所在目录
for entry in fs::read_dir(dir).expect("无法读取目录") {
let entry = entry.expect("无法读取文件项");
let path = entry.path();
if let Some(ext) = path.extension() {
if ext == "jpg" || ext == "png" {
let new_name = format!("vacation_{}", path.file_name().unwrap().to_str().unwrap());
let new_path = path.with_file_name(new_name);
fs::rename(&path, &new_path).expect("重命名失败");
println!("重命名: {:?} -> {:?}", path.file_name(), new_path.file_name());
}
}
}
}
✅ 你可以扩展它:支持命令行参数、正则匹配、后缀修改等。
📌 2. 下载网页内容并保存为文件
🎯 用途:
输入一个 URL,下载该网页的 HTML 并保存为 page.html
。
💡 Rust 优势:
比 curl 命令更可控,可加入错误处理、自动解码等。
📦 依赖:
使用 https://docs.rs/reqwest/latest/reqwest/(异步 HTTP 客户端)和 tokio
。
🧪 安装依赖(在 Cargo.toml
中):
[dependencies]
reqwest = { version = "0.11", features = ["blocking"] } # 同步版本,简单
# 或者用异步版本 + tokio(更强大)
🧠 同步版本代码(简单,适合脚本):
use reqwest::blocking::get;
use std::fs::File;
use std::io::Write;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let url = "https://example.com";
let resp = get(url)?;
let body = resp.text()?;
let mut file = File::create("page.html")?;
file.write_all(body.as_bytes())?;
println!("网页已保存为 page.html");
Ok(())
}
✅ 想更强大?加上命令行参数解析(用
clap
crate)、异步下载、批量下载等。
📌 3. 统计文本文件词频(Word Count)
🎯 用途:
读取一个 .txt
文件,统计每个单词出现的次数,输出频率最高的几个词。
💡 Rust 优势:
比 Python 更快,适合处理大文本文件。
🧠 核心思路:
- 读取文件内容
- 按空格/标点分割单词
- 用
HashMap
统计词频 - 排序并输出
📦 依赖:基本不用,标准库足够
🧠 简化代码思路:
use std::collections::HashMap;
use std::fs;
fn main() {
let text = fs::read_to_string("input.txt").expect("无法读取文件");
let mut freq = HashMap::new();
for word in text.to_lowercase().split(|c: char| !c.is_alphabetic()) {
if word.len() > 0 {
*freq.entry(word.to_string()).or_insert(0) += 1;
}
}
// 按词频排序
let mut sorted: Vec<_> = freq.into_iter().collect();
sorted.sort_by(|a, b| b.1.cmp(&a.1));
// 输出前10
for (word, count) in sorted.iter().take(10) {
println!("{}: {}", word, count);
}
}
✅ 想更强大?支持命令行传文件、过滤停用词、正则分词等。
📌 4. 简易定时提醒工具(命令行版 Pomodoro)
🎯 用途:
运行一个命令,比如 cargo run -- 25
,表示倒计时 25 分钟,期间打印剩余时间,结束时提醒。
💡 Rust 优势:
跨平台、精准计时、可扩展为桌面通知或声音提醒。
🧠 核心思路:
- 用
std::thread::sleep
做延时 - 循环倒计时并打印
- 到时间后
println!("时间到!")
或调用通知
🧪 简单代码骨架:
use std::thread;
use std::time::{Duration, Instant};
fn main() {
let minutes: u64 = 25; // 可改成从命令行参数读取
let total_secs = minutes * 60;
println!("开始 {} 分钟倒计时...", minutes);
for remaining in (0..total_secs).rev() {
let mins = remaining / 60;
let secs = remaining % 60;
println!("剩余时间: {:02}:{:02}", mins, secs);
thread::sleep(Duration::from_secs(1));
}
println!("⏰ 时间到!休息一下吧~");
}
✅ 想更贴心?调用系统通知(如
notify-rust
crate)、播放提示音、支持 GUI 等。
📌 5. 解析日志文件并提取错误信息
🎯 用途:
分析某个 .log
文件,找出所有包含 "ERROR"
的行,导出到 errors.log
。
💡 Rust 优势:
比 grep "ERROR" app.log > errors.log
更可控,可做更复杂的过滤和统计。
🧠 核心思路:
- 逐行读取日志文件
- 检查是否包含关键字(如
"ERROR"
) - 写入新文件
🧪 示例代码:
use std::fs::File;
use std::io::{BufRead, BufReader, Write};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let log_path = "app.log";
let out_path = "errors.log";
let infile = File::open(log_path)?;
let outfile = File::create(out_path)?;
let reader = BufReader::new(infile);
let mut error_writer = std::io::BufWriter::new(outfile);
for line in reader.lines() {
let line = line?;
if line.contains("ERROR") {
writeln!(error_writer, "{}", line)?;
}
}
println!("错误日志已提取到: {}", out_path);
Ok(())
}
✅ 可扩展为:多关键字过滤、正则匹配、时间范围筛选等。
🧰 学习建议 & 工具推荐
工具/库 | 用途 | 推荐理由 |
---|---|---|
https://crates.io/crates/clap | 命令行参数解析 | 让你的脚本支持 --input xxx --output yyy 等用法,更专业 |
https://crates.io/crates/reqwest | HTTP 客户端 | 用于下载、调用 API 等 |
https://tokio.rs/ | 异步运行时 | 适合高性能异步脚本(如并发下载) |
https://crates.io/crates/notify-rust | 桌面通知 | 适合提醒类脚本 |
https://crates.io/crates/serde + https://crates.io/crates/serde_json | JSON 解析/生成 | 处理 API 响应或配置文件 |
https://crates.io/crates/csv | CSV 文件读写 | 处理表格数据 |
✅ 总结:Rust 写小脚本的优势
特性 | 说明 |
---|---|
🛡️ 安全 | 没有 Python 那样的运行时异常,编译器帮你避免很多错误 |
⚡ 性能高 | 比脚本语言快很多,适合处理大文件或高并发任务 |
📦 单文件可执行 | 编译后无需依赖解释器,直接运行,适合部署 |
🧰 丰富的库生态 | 几乎任何功能都有现成的 crate 可用 |
🎓 适合练手 | 小脚本是学习 Rust IO、错误处理、模块化的绝佳练手项目 |