Vorlagen-Dialog in der Konsole verfügbar machen

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen

Ich habe im Dateimanager (im PCManFM getestet) die Möglichkeit vermisst, ohne die Maus zu benutzen in ein Verzeichnis meiner Wahl eine Datei aus dem Vorlagen-Ordner zu kopieren. Ich habe mein Anliegen für ChatGPT beschrieben und ChatGPT hat so ein dialog-Skript erstellt, dass unter Ubuntu 24.04.1 LTS zuverlässig funktioniert.

caption

#!/bin/bash

# Pfade zum Verzeichnis mit Vorlagen und Standardzielverzeichnis vorgeben
KKTMPLDIR=/hier-pfad-zum-Test-Verzeichnis
SOURCE_DIR=$KKTMPLDIR/ELL-dir1
DEFAULT_TARGET_DIR=$KKTMPLDIR/ELL-dir2
TARGET_DIR=""

# Sicherstellen, dass das Quellverzeichnis existiert
if [[ ! -d "$SOURCE_DIR" ]]; then
  echo "Das Verzeichnis $SOURCE_DIR existiert nicht."
  exit 1
fi

# Wechsel in das Quellverzeichnis
cd "$SOURCE_DIR" || exit

# Funktion: Zielverzeichnis abfragen
get_target_directory() {
  TARGET_DIR=$(dialog --stdout --clear \
    --title "Zielverzeichnis" \
    --inputbox "Geben Sie das Ziel-Verzeichnis dir2 ein (ESC oder Strg+C zum Abbrechen):" 10 50)

  if [[ $? -ne 0 ]]; then
    clear
    echo "Abbruch. Das Skript wurde beendet."
    exit 0
  fi

  # Setze Standardziel, falls leer oder ./ angegeben
  if [[ -z "$TARGET_DIR" || "$TARGET_DIR" == "./" ]]; then
    TARGET_DIR="$DEFAULT_TARGET_DIR"
    echo "Kein gültiges Zielverzeichnis angegeben. Verwende Standardziel: $DEFAULT_TARGET_DIR"
  fi
}

# Funktion: Vorlagenliste erstellen
generate_template_list() {
  local template_list=()
  for file in "$SOURCE_DIR"/*; do
    if [[ -f "$file" ]]; then
      template_list+=("$(basename "$file")" "-")
    fi
  done
  echo "${template_list[@]}"
}

# Funktion: Datei auswählen mit --menu
select_template() {
  local template_list
  template_list=($(generate_template_list))

  if [[ ${#template_list[@]} -eq 0 ]]; then
    dialog --msgbox "Keine Vorlagen im Verzeichnis $SOURCE_DIR gefunden." 10 40
    exit 1
  fi

  local selected_file
  selected_file=$(dialog --stdout --clear \
    --title "Vorlagen-Auswahl" \
    --menu "Bitte wählen Sie eine Vorlage und drücken Sie 'Enter':" 15 50 10 \
    "${template_list[@]}")

  # Prüfen auf Abbruch
  if [[ $? -ne 0 ]]; then
    clear
    echo "Abbruch. Das Skript wurde beendet."
    exit 0
  fi

  echo "$selected_file"
}

# Hauptlogik: Wiederholtes Menü
while :; do
  # Zielverzeichnis abfragen, falls noch nicht gesetzt
  if [[ -z "$TARGET_DIR" ]]; then
    get_target_directory
  fi

  # Datei auswählen
  TEMPLATE=$(select_template)

  # Abbruch prüfen
  if [[ -z "$TEMPLATE" ]]; then
    clear
    echo "Abbruch. Das Skript wurde beendet."
    exit 0
  fi

  # Platzhalter für "Prüfen, ob die ausgewählte Datei existiert"

  # Zielverzeichnis erstellen, falls es nicht existiert
  mkdir -p "$TARGET_DIR"

  # Datei kopieren
  cp "$SOURCE_DIR/$TEMPLATE" "$TARGET_DIR" && \
  echo "Die Datei wurde erfolgreich nach $TARGET_DIR kopiert."

  # Datei öffnen
  if ! xdg-open "$TARGET_DIR/$TEMPLATE" 2>/dev/null; then
    echo "Die Datei $TARGET_DIR/$TEMPLATE konnte nicht geöffnet werden."
    echo "Bitte prüfen Sie manuell, ob die Datei existiert und eine zugehörige Anwendung verfügbar ist."
  fi

  # Benutzer fragen, ob er fortfahren oder beenden möchte
  dialog --clear --title "Aktion wählen" \
    --yesno "Möchten Sie eine weitere Datei kopieren und öffnen? \n\n<Wähle JA zum Fortfahren>\n<Wähle NEIN zum Beenden>" 10 50

  if [[ $? -ne 0 ]]; then
    clear
    echo "Das Skript wurde beendet."
    exit 0
  fi
done

Das Skript kann man in ~/.local/bin speichern, um es systemweit verfügbar zu machen.

Bekannte Schöhnheitsfehler

Im Originalquellcode, der von ChatGPT generiert wurde, wurde im Abschnitt, der als

# Platzhalter für "Prüfen, ob die ausgewählte Datei existiert"

markiert ist, nach dem Abbrechen im Dialog "Vorlagen-Auwahl" geprüft, ob die ausgewählte Datei existiert. Dies hat zu einer Endlosschleife geführt. Deswegen wurde dieser Abschnitt entfernt - s. herausgeschnittene Zeilen unten. Dies führt dazu, dass beim Abbrechen im "Vorlagen-Auwahl"-Dialog einige Klicks oder Tastendrücke mehr gemacht werden müssen, aber die Grundfunktionalität ist dadurch nicht gestört.

# Prüfen, ob die ausgewählte Datei existiert
 if [[ ! -f "$SOURCE_DIR/$TEMPLATE" ]]; then
   dialog --msgbox "Die ausgewählte Datei existiert nicht. Bitte versuchen Sie es erneut." 10 40
    continue
 fi

Links

  1. Diskussion zum Skript im Forum
  2. Version des Skripts vom 28.12.2024, 04:51 Uhr, in der die Liste der Dateien im Skript selbst definiert ist.