- Bugfix: Dateien mit führendem Punkt wurden zu "unnamed.xxx" umbenannt, da der Punkt fälschlicherweise als Extension-Trenner interpretiert wurde. Jetzt wird der führende Punkt als hidden_prefix separat behandelt. - Alle Clippy-Warnungen behoben (redundanter Import, kollabierbare if-Blöcke, manuelle Range-Checks) - CLAUDE.md für Projekt-Dokumentation hinzugefügt Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
5 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Projekt-Übersicht
NameToUnix ist ein Rust-CLI-Tool zum Bereinigen von Datei- und Verzeichnisnamen gemäß Linux-Konventionen. Es ersetzt Leerzeichen, Sonderzeichen und deutsche Umlaute und arbeitet rekursiv durch Verzeichnisbäume.
Dies ist das erste Rust-Projekt des Autors - Code-Verbesserungen sollten klar und didaktisch begründet werden.
Build & Test
# Development build
cargo build
# Release build (optimiert, für Distribution)
cargo build --release
# Binary liegt dann unter:
# target/release/NameToUnix
# Tests ausführen
cargo test
# Tests mit Ausgabe
cargo test -- --nocapture
# Linting
cargo clippy
# Formatierung prüfen
cargo fmt --check
# Formatierung anwenden
cargo fmt
Lokales Testen
# Test-Verzeichnisbaum mit skurrilen Dateinamen erstellen
cd test
./create_test_tree.sh
# Vorschau (keine Änderungen):
cargo run -- -n ./testverzeichnis
# Mit Änderungen:
cargo run -- ./testverzeichnis
# Mit Verbose-Ausgabe:
cargo run -- -v ./testverzeichnis
Code-Architektur
Das Projekt ist in Module aufgeteilt:
-
main.rs: Entry Point- Initialisiert Logger (
env_logger) - Parsed CLI-Argumente mit
clap - Lädt Konfiguration aus bis zu 3 Orten (Prioritätsreihenfolge: lokal > user > global)
- Sammelt alle Datei-/Verzeichniseinträge via
walkdir - Sortiert nach Tiefe (tiefste zuerst), um Parent-Verzeichnisse nicht zu früh umzubenennen
- Zeigt optional Fortschrittsbalken (
indicatif) bei >50 Einträgen
- Initialisiert Logger (
-
cli.rs: Command-Line Interface- Definiert
Cli-Struct mitclap::Parser - Argumente:
paths,--quiet,--no-changes,--force,--exclude,--verbose,--modify-root ArgGroupverhindert gleichzeitige Nutzung von--no-changesund--force
- Definiert
-
config.rs: KonfigurationsmanagementConfig-Struct mitHashMap<String, String>für benutzerdefinierte Ersetzungen- Lädt TOML-Dateien aus 3 Orten (in dieser Reihenfolge):
/etc/NameToUnix/config.toml(System-global)~/.config/NameToUnix/config.toml(User-spezifisch)./.NameToUnix.conf(Arbeitsverzeichnis, höchste Priorität)
- Spätere Configs überschreiben frühere (
extend)
-
sanitizer.rs: Kern-Logik der Dateinamen-Bereinigungclean_filename(): Hauptfunktion- Trennt Stamm und Extension
- Schützt spezielle Identifikatoren (
C++,C#) via Platzhalter - Wendet zuerst Config-Replacements an, dann hardcoded Replacements
- Ersetzt Emojis und hochgestellte Zeichen durch
_ - Entfernt ungültige Zeichen via Regex (
[^\w.\-]) - Normalisiert Punkt/Unterstrich-Kombinationen
- Trimmt führende Unterstriche (behält aber führenden Punkt)
- Stellt Platzhalter wieder her
is_excluded(): Prüft Glob-Patternsis_safe_rename(): Sicherheitscheck vor Umbenennung (prüft ob Ziel existiert ohne--force)
Konfigurationsdatei-Logik
- TOML-Format mit Sektion
[replacements] - Wichtig: Hardcoded-Transformationen (z.B. Apostroph-Entfernung, Umlaut-Ersetzung) sind immer vorrangig und nicht deaktivierbar
- Config-Replacements werden vor den hardcoded Replacements angewendet
- Lokale Configs überschreiben User-Configs überschreiben System-Configs
Besonderheiten
-
Tiefenbasierte Sortierung: Umbenennung erfolgt von den tiefsten Verzeichnissen/Dateien nach oben, um Konflikte zu vermeiden (Parent-Verzeichnisse dürfen nicht vor ihren Kindern umbenannt werden).
-
Platzhalter für Spezialfälle:
C++,c++,C#,c#werden temporär durch Token (CPLUSPLUS, etc.) geschützt, damit+und#nicht durch Unterstriche ersetzt werden. -
Emoji-Erkennung: Nutzt das
emojis-Crate zur Emoji-Erkennung und Unicode-Segmentation für grapheme-korrekte Verarbeitung. -
Performance-Optimierung: Regex-Patterns sind als
static Lazy<Regex>definiert (viaonce_cell) für wiederholte Nutzung ohne Re-Compilation. -
Root-Directory-Schutz: Standardmäßig wird das Root-Verzeichnis (depth 0) nicht umbenannt, außer
--modify-rootist gesetzt.
Verwendete Dependencies
clapmit derive-Feature für CLI-Parsingwalkdirfür rekursives Traversierenglobfür Exclude-Patternserde+tomlfür Config-Dateienanyhowfür Error-Handlinglog+env_loggerfür Loggingindicatiffür Progress-Barsregexfür Pattern-Matchingunicode-segmentationfür korrekte grapheme-basierte String-Verarbeitungemojisfür Emoji-Erkennungonce_cellfür lazy-static Regex-Patternsdirszum Finden des User-Home-Verzeichnisses
Wichtige Hinweise für Code-Änderungen
- Die Reihenfolge der Transformationen in
clean_filename()ist wichtig und sollte nicht ohne Tests geändert werden - Hardcoded Replacements sind bewusst nicht über Config deaktivierbar (Design-Entscheidung)
- Tests sollten mit dem
create_test_tree.sh-Skript durchgeführt werden - Bei Regex-Änderungen: Performance-Impact beachten (werden für jede Datei ausgeführt)