home ~ projects ~ socials

Update All Files Recursively In A Directory With A Give Extension With Rust

This is a very simple process that recursively loops over a directory and updates any files with a given extension:

use std::fs;
use std::path::PathBuf;
use walkdir::WalkDir;

fn main() {
    update_files("some/path");
}

fn update_file(file_path: PathBuf) {
    let contents = fs::read_to_string(&file_path).unwrap();
    if !contents.contains("-- site:") {
        let mut new_contents = contents.trim_end().to_string();
        new_contents.push_str("\n-- site: aws\n");
        let _ = fs::write(file_path, new_contents);
    }
}

fn update_files(dir: &str) {
    for entry in WalkDir::new(dir) {
        let pb = entry.unwrap().into_path();
        if match pb.extension() {
            Some(extwrap) => match extwrap.to_str() {
                Some(ext) => match ext {
                    "org" => true,
                    _ => false,
                },
                None => false,
            },
            None => false,
        } {
            update_file(pb);
        }
    }
}

Notes

  • The update_files function is responsibe for finding the filew with the extension. It passes them to update_file
  • The update_file function does the work. In this example I'm looking for the string -- site: in the file. I add it to the end of the file (after truncating it) if it's not already there
  • This code uses the walkdir create that can be installed with cargo add walkdir
  • One imporvement would be to move the file extension into an argument that's passed to the function
  • Adding more error handling is also possible, but I'm fine with this panicing if something goes wrong. It's effectively a one-off script.
-- end of line --

References