Vorlagen-Dialog in der Konsole verfügbar machen
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.
#!/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
- Diskussion zum Skript im Forum
- Version des Skripts vom 28.12.2024, 04:51 Uhr, in der die Liste der Dateien im Skript selbst definiert ist.