Coniguration Backup mit seperaten Datei

This commit is contained in:
christian 2026-05-10 12:08:11 +02:00
parent 4d4f66354d
commit 3f70509085
3 changed files with 239 additions and 52 deletions

View file

@ -12,7 +12,7 @@ Dieses Bash-Skript automatisiert das Erstellen einer konsistenten Ordnerstruktur
## 🚀 Funktionen
* Automatisierte Struktur: Erstellt vordefinierte Ordner für Hardware- und Softwareprojekte.
* Verschlagwortung (Tags): Fragt beim Erstellen Schlagworte ab und schreibt diese als #Tags in die Projekt-README für eine blitzschnelle Suche.
* Verschlagwortung (Tags): Fragt beim Erstellen Schlagworte ab und schreibt diese als Tags in die Projekt-README für eine blitzschnelle Suche.
* Einsatzfertig:
* Erstellt direkt eine main.py für Python-Projekte.
* Erstellt ein ausführbares .sh-Skript für Bash-Projekte.
@ -55,7 +55,7 @@ Starte die Toolbox über das Desktop-Icon oder direkt im Terminal via `./toolbox
Wähle **"1. Projekt erstellen"**. Ein grafischer Dialog führt dich durch die Einrichtung:
* **Name**: Der Projektname (Leerzeichen werden automatisch in Unterstriche umgewandelt).
* **Typ**: Auswahl zwischen Hardware (CAD/CAM Struktur) oder Software (Python/Bash).
* **Tags**: Schlagworte für die spätere Suche (z.B. #Motor #ESP32).
* **Tags**: Schlagworte für die spätere Suche.
![Projekt-Setup Dialog](name_angabe.png)
![Projekt-Setup Dialog](kategorien_auswahl.png)

161
find.sh
View file

@ -1,56 +1,117 @@
#!/bin/bash
# Pfad ermitteln
SCRIPT_PATH=$(readlink -f "$0")
BASE_DIR=$(dirname "$SCRIPT_PATH")
# ==============================================================================
# TOOLBOX MODUL: CONFIG-SYNC PRO (Relativ-Edition)
# ==============================================================================
while true; do
# 1. Tags sammeln (optimiert)
# Wir filtern hier noch aggressiver nach sauberen Text-Tags
tag_counts=$(grep -rhioE "(#\w+|Tags:.*)" "$BASE_DIR" --include="README.md" 2>/dev/null | \
sed 's/Tags://g' | tr ',' '\n' | tr -d '\r' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | \
grep -v '^$' | sort | uniq -c | sort -rn)
# 1. DYNAMISCHE PFADERMITTLUNG
# Ermittelt den Ordner, in dem dieses Skript liegt
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
if [ -z "$tag_counts" ]; then
zenity --error --title="Fehler" --text="Keine Tags gefunden in:\n$BASE_DIR"
break
# Ordner relativ zum Skript-Standort definieren
CONFIG_DIR="$SCRIPT_DIR/configs/profiles"
BACKUP_BASE="$SCRIPT_DIR/configs/data"
# Ordner sofort erstellen
mkdir -p "$CONFIG_DIR"
mkdir -p "$BACKUP_BASE"
# 2. UMGEBUNGSPRÜFUNG
ZENITY_BIN=$(which zenity)
[ -z "$ZENITY_BIN" ] && ZENITY_BIN="/usr/bin/zenity"
# Prüfen auf grafische Oberfläche (wichtig für SSH)
if [ -z "$DISPLAY" ]; then
echo "FEHLER: Keine grafische Oberfläche (DISPLAY) erkannt."
echo "Nutze 'ssh -X christian@debian-keller' für den Fernzugriff."
exit 1
fi
# 3. PROFIL-MANAGEMENT
PROFILES=""
if ls "$CONFIG_DIR"/*.conf >/dev/null 2>&1; then
PROFILES=$(ls "$CONFIG_DIR"/*.conf | xargs -n 1 basename | sed 's/\.conf//')
fi
# Auswahlfenster für Profil
if [ -z "$PROFILES" ]; then
PROFILE_ACTION=$($ZENITY_BIN --list --title="Profil-Management" --column="Aktion" \
"Neues Profil erstellen" --width=300 --height=200)
else
PROFILE_ACTION=$($ZENITY_BIN --list --title="Profil wählen" --column="Profil / Aktion" \
$PROFILES "Neues Profil erstellen" --width=300 --height=300)
fi
[ -z "$PROFILE_ACTION" ] && exit 0
# 4. PROFIL-DATEI FESTLEGEN
if [ "$PROFILE_ACTION" == "Neues Profil erstellen" ]; then
PROFILE_NAME=$($ZENITY_BIN --entry --title="Neues Profil" --text="Name (z.B. Keller_PC):")
[ -z "$PROFILE_NAME" ] && exit 0
PROFILE_FILE="$CONFIG_DIR/${PROFILE_NAME}.conf"
# Standard-Einträge für ein neues Profil
echo "CrealitySlicer|$HOME/.config/CrealitySlicer/" > "$PROFILE_FILE"
echo "FreeCAD|$HOME/.config/FreeCAD/" >> "$PROFILE_FILE"
$ZENITY_BIN --info --text="Profil $PROFILE_NAME erstellt." --width=250
else
PROFILE_FILE="$CONFIG_DIR/${PROFILE_ACTION}.conf"
fi
# 5. AKTION WÄHLEN
ACTION=$($ZENITY_BIN --list --title="Aktion wählen" \
--column="Aktion" "Backup (System -> Toolbox)" "Restore (Toolbox -> System)" --width=300)
[ -z "$ACTION" ] && exit 0
# 6. PROGRAMM-AUSWAHL
PROGRAM_LIST=$(cat "$PROFILE_FILE")
OPTIONS=()
while IFS='|' read -r NAME PATH; do
[ -z "$NAME" ] && continue
OPTIONS+=(FALSE "$NAME")
done <<< "$PROGRAM_LIST"
SELECTED=$($ZENITY_BIN --list --title="Programme wählen" --checklist \
--column="Wahl" --column="Programm" "${OPTIONS[@]}" --width=350 --height=400)
[ -z "$SELECTED" ] && exit 0
# 7. DURCHFÜHRUNG
IFS='|' read -ra ADDR <<< "$SELECTED"
for NAME in "${ADDR[@]}"; do
CURRENT_PATH=$(grep "^$NAME|" "$PROFILE_FILE" | cut -d'|' -f2)
NEW_PATH=$($ZENITY_BIN --entry --title="$NAME" --text="Pfad prüfen/anpassen:" \
--entry-text="$CURRENT_PATH" --width=500)
if [ -n "$NEW_PATH" ]; then
# Profil-Datei bei Änderung aktualisieren
if [ "$NEW_PATH" != "$CURRENT_PATH" ]; then
# Nutzt @ als Trenner in sed, falls Pfade Slashes enthalten
sed -i "s@^$NAME|.*@$NAME|$NEW_PATH@" "$PROFILE_FILE"
fi
DEST_PATH="$BACKUP_BASE/$NAME"
if [ "$ACTION" == "Backup (System -> Toolbox)" ]; then
if [ -e "$NEW_PATH" ]; then
mkdir -p "$DEST_PATH"
rsync -av --delete "$NEW_PATH/" "$DEST_PATH/"
else
$ZENITY_BIN --error --text="Quellpfad nicht gefunden:\n$NEW_PATH"
fi
elif [ "$ACTION" == "Restore (Toolbox -> System)" ]; then
if [ -d "$DEST_PATH" ]; then
# Sicherheitskopie mit Tilde (~) erstellen
if [ -e "$NEW_PATH" ]; then
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="${NEW_PATH%/}_${TIMESTAMP}~"
mv "$NEW_PATH" "$BACKUP_NAME"
fi
mkdir -p "$NEW_PATH"
rsync -av "$DEST_PATH/" "$NEW_PATH/"
fi
fi
fi
done
# 2. Anzeige-Liste erstellen
zenity_list=$(echo "$tag_counts" | awk '{count=$1; $1=""; print $0 " (" count ")"}' | sed 's/^[[:space:]]*//')
# 3. Auswahl
selected_item=$(echo "$zenity_list" | zenity --list \
--title="Projekt-Tag-Suche" \
--column="Tag (Anzahl)" \
--width=400 --height=500 \
--text="Wähle einen Tag aus:")
if [ -z "$selected_item" ]; then break; fi
# Extrahiere den reinen Tag (nimmt alles vor der ersten Klammer)
selected_tag=$(echo "$selected_item" | sed 's/ (.*)//')
# 4. Suche nach den Projekten
# Wir suchen jetzt nach dem exakten String im gesamten Verzeichnisbaum
results=$(grep -rlF "$selected_tag" "$BASE_DIR" --include="README.md" 2>/dev/null | while read -r file; do
dirname "$file"
done | sort -u)
if [ -z "$results" ]; then
zenity --info --text="Keine Projekte für den Tag '$selected_tag' gefunden.\n\nSuchpfad: $BASE_DIR"
continue
fi
# 5. Projektauswahl
selected_project=$(echo "$results" | zenity --list \
--title="Ergebnisse für: $selected_tag" \
--column="Projekt-Pfad" \
--width=800 --height=400 \
--ok-label="README öffnen" \
--cancel-label="Zurück")
if [ -n "$selected_project" ] && [ -f "$selected_project/README.md" ]; then
xdg-open "$selected_project/README.md" &>/dev/null &
fi
done
$ZENITY_BIN --info --text="Vorgang erfolgreich beendet!" --width=250

126
sync_configs.sh Executable file
View file

@ -0,0 +1,126 @@
#!/bin/bash
# ==============================================================================
# TOOLBOX MODUL: CONFIG-SYNC PRO (Dynamic Folder Edition)
# ==============================================================================
# 1. SYSTEM-PFADE SICHERSTELLEN
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 2. DYNAMISCHE PFADERMITTLUNG FÜR DAS SKRIPT
# Findet den Ort, an dem dieses Skript gespeichert ist
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
# Ordner relativ zum Skript-Standort definieren
CONFIG_DIR="$SCRIPT_DIR/configs/profiles"
BACKUP_BASE="$SCRIPT_DIR/configs/data"
# Ordner sofort erstellen
/usr/bin/mkdir -p "$CONFIG_DIR"
/usr/bin/mkdir -p "$BACKUP_BASE"
# 3. UMGEBUNGSPRÜFUNG
ZENITY_BIN=$(/usr/bin/which zenity)
[ -z "$ZENITY_BIN" ] && ZENITY_BIN="/usr/bin/zenity"
# Prüfen auf grafische Oberfläche (wichtig für SSH)
if [ -z "$DISPLAY" ]; then
echo "FEHLER: Keine grafische Oberfläche (DISPLAY) erkannt."
echo "Nutze 'ssh -X christian@debian-keller' für den Fernzugriff."
exit 1
fi
# 4. PROFIL-MANAGEMENT
PROFILES=""
if /usr/bin/ls "$CONFIG_DIR"/*.conf >/dev/null 2>&1; then
PROFILES=$(/usr/bin/ls "$CONFIG_DIR"/*.conf | /usr/bin/xargs -n 1 basename | /usr/bin/sed 's/\.conf//')
fi
# Auswahlfenster für Profil
if [ -z "$PROFILES" ]; then
PROFILE_ACTION=$($ZENITY_BIN --list --title="Profil-Management" --column="Aktion" \
"Neues Profil erstellen" --width=300 --height=200)
else
PROFILE_ACTION=$($ZENITY_BIN --list --title="Profil wählen" --column="Profil / Aktion" \
$PROFILES "Neues Profil erstellen" --width=300 --height=300)
fi
[ -z "$PROFILE_ACTION" ] && exit 0
# 5. PROFIL-DATEI FESTLEGEN
if [ "$PROFILE_ACTION" == "Neues Profil erstellen" ]; then
PROFILE_NAME=$($ZENITY_BIN --entry --title="Neues Profil" --text="Name (z.B. Keller_PC):")
[ -z "$PROFILE_NAME" ] && exit 0
PROFILE_FILE="$CONFIG_DIR/${PROFILE_NAME}.conf"
# Standard-Einträge für ein neues Profil
echo "CrealitySlicer|$HOME/.config/CrealitySlicer/" > "$PROFILE_FILE"
echo "FreeCAD|$HOME/.config/FreeCAD/" >> "$PROFILE_FILE"
$ZENITY_BIN --info --text="Profil $PROFILE_NAME erstellt." --width=250
else
PROFILE_FILE="$CONFIG_DIR/${PROFILE_ACTION}.conf"
fi
# 6. AKTION WÄHLEN
ACTION=$($ZENITY_BIN --list --title="Aktion wählen" \
--column="Aktion" "Backup (System -> Toolbox)" "Restore (Toolbox -> System)" --width=300)
[ -z "$ACTION" ] && exit 0
# 7. PROGRAMM-AUSWAHL
PROGRAM_LIST=$(/usr/bin/cat "$PROFILE_FILE")
OPTIONS=()
while IFS='|' read -r NAME PATH; do
[ -z "$NAME" ] && continue
OPTIONS+=(FALSE "$NAME")
done <<< "$PROGRAM_LIST"
SELECTED=$($ZENITY_BIN --list --title="Programme wählen" --checklist \
--column="Wahl" --column="Programm" "${OPTIONS[@]}" --width=350 --height=400)
[ -z "$SELECTED" ] && exit 0
# 8. DURCHFÜHRUNG
IFS='|' read -ra ADDR <<< "$SELECTED"
for NAME in "${ADDR[@]}"; do
# Pfad aus Profil laden
CURRENT_PATH=$(/usr/bin/grep "^$NAME|" "$PROFILE_FILE" | /usr/bin/cut -d'|' -f2)
# Pfad-Bestätigung (vorausgefüllt aus cp.conf)
NEW_PATH=$($ZENITY_BIN --entry --title="$NAME" --text="Pfad prüfen/anpassen:" \
--entry-text="$CURRENT_PATH" --width=600)
if [ -n "$NEW_PATH" ]; then
# Profil-Datei bei Änderung aktualisieren
if [ "$NEW_PATH" != "$CURRENT_PATH" ]; then
/usr/bin/sed -i "s@^$NAME|.*@$NAME|$NEW_PATH@" "$PROFILE_FILE"
fi
# DYNAMISCHER ORDNERNAME: Wir nehmen den Namen des Ordners aus dem Systempfad
# Entfernt abschließende Slashes für basename
CLEAN_PATH="${NEW_PATH%/}"
REAL_FOLDER_NAME=$(/usr/bin/basename "$CLEAN_PATH")
DEST_PATH="$BACKUP_BASE/$REAL_FOLDER_NAME"
if [ "$ACTION" == "Backup (System -> Toolbox)" ]; then
if [ -e "$NEW_PATH" ]; then
/usr/bin/mkdir -p "$DEST_PATH"
# Sichert in den Ordner mit dem Namen aus dem System (z.B. CrealityPrint)
/usr/bin/rsync -av --delete "$NEW_PATH/" "$DEST_PATH/"
else
$ZENITY_BIN --error --text="Quellpfad nicht gefunden:\n$NEW_PATH"
fi
elif [ "$ACTION" == "Restore (Toolbox -> System)" ]; then
if [ -d "$DEST_PATH" ]; then
# Sicherheitskopie mit Tilde (~) erstellen
if [ -e "$NEW_PATH" ]; then
TIMESTAMP=$(/usr/bin/date +%Y%m%d_%H%M%S)
BACKUP_NAME="${CLEAN_PATH}_${TIMESTAMP}~"
/usr/bin/mv "$NEW_PATH" "$BACKUP_NAME"
fi
/usr/bin/mkdir -p "$NEW_PATH"
/usr/bin/rsync -av "$DEST_PATH/" "$NEW_PATH/"
fi
fi
fi
done
$ZENITY_BIN --info --text="Vorgang erfolgreich beendet!" --width=250