Rust5个实用的小脚本

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、错误处理、模块化的绝佳练手项目

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注