From d6bfcd51aa8ec6e302833e5eaad8de8e58ceb5b6 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Fri, 5 Jan 2024 00:21:45 +0100 Subject: [PATCH] neues Projekt angefangen Signed-off-by: Stephan Richter --- .gitignore | 2 ++ Cargo.lock | 7 ++++++ Cargo.toml | 8 +++++++ src/main.rs | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e2a3069 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +*~ diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..e00daaa --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "date_renamer" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..13ab542 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "date_renamer" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..0b26c54 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,68 @@ +//! # date_renamer +//! Kleines Programm, dass hilft Datumsangaben aus Dateinamen an den Anfang des Dateinamens zu bringen. +//! Beispiel: +//! +//! | Dateiname vor Umbenennung | Dateiname nach Umbenennung | +//! |---------------------------|----------------------------| +//! | irgend_eine_datei_dat20231231_test.pdf | 20231231_irgend_eine_datei_test.pdf | +//! +//! ## Verwendung +//! Das binary wird mit dem Pfad zu einem Ordner aufgerufen, z.B. DateRenamer _/home/srichter/Test-Ordner_. +//! Dieser Ordner wird dann (nicht-rekursiv) nach Dateien durchsucht und diese ggf. umbenannt. + +use std::env; +use std::path::Path; +use std::path::PathBuf; +use std::fs; + +/// Informationen zur Programm-Funktion +fn usage(command: &String) { + println!("Usage: {} ",command); +} + +/// Einsprung für die Verarbeitung des angegebenen Verzeichnisses +fn process_dir(directory: &String) { + let path = Path::new(directory); + assert!(env::set_current_dir(&path).is_ok()); + let entries = fs::read_dir(".").unwrap(); + println!("contents of {}:",path.display()); + for entry in entries { + let path = entry.unwrap().path(); + if path.is_file() { + process_file(&path); + } + } +} + +/// Verarbeitung einer einzelnen Datei im Verzeichnis +fn process_file(file: &PathBuf){ + let name = file.file_name().unwrap().to_str().unwrap(); + + + let mut vec = Vec::new(); + for part in name.split("_"){ + match part.get(..3) { + Some("dat") => vec.insert(0,part.get(3..).unwrap()), + _ => vec.push(part), + } + } + let new_name = vec.join("_"); + println!("- {} → {}",name,new_name); + let _ = fs::rename(name,new_name); +} + +/// Einsprungpunkt. +/// * Prüft, on ein Parameter (Verzeichnis) angegeben wurde +/// * ruft dann entsprechend _usage_ oder _process_dir_ auf. + +fn main() { + let args: Vec = env::args().collect(); + let command = &args[0]; + if args.len() != 2 { + return usage(command); + } + + let dir = &args[1]; + println!("Started {} on {}",command,dir); + process_dir(dir); +}