scripte/verzeichnis_checker.sh

310 lines
12 KiB
Bash

# -----------------------------------------------------------
# Betriebsanleitung und Ablaufplan für verz_checker.sh
# -----------------------------------------------------------
#
# Dieses Skript dient zur automatisierten Prüfung und Bearbeitung
# von Verzeichnissen. Es kann in einem angegebenen Zielverzeichnis
# spezifische Dateien und Ordner suchen, analysieren und verwalten.
#
# Funktionen:
# 1) Prüfung von '3D'-Ordnern und das Löschen aller Inhalte (inklusive .rar-Dateien).
# 2) Prüfung von 'Documentation'-Ordnern, bei denen nur `.rar`-Dateien erhalten bleiben.
# 3) Auflistung und ggf. Löschen von Ordnern mit "Kopie" im Namen.
# 4) Auflistung und ggf. Löschen von Ordnern mit "Nachscan" im Namen.
# 5) Prüfung und ggf. Löschen von `.rar`-Dateien in den ersten zwei Verzeichnisebenen.
# 6) Aktualisierung und Verwendung von Caches für schnelles Arbeiten.
# 7) Beenden des Skripts.
#
# ---------------------------------------------
# Wichtige Hinweise:
# ---------------------------------------------
# 1) Skriptaufruf:
# Sie können das Skript mit einem Zielverzeichnis aufrufen:
# ./verz_checker.sh /pfad/zum/zielverzeichnis
# Wird kein Zielverzeichnis angegeben, wird ein Standardpfad verwendet.
#
# 2) Funktion des Caches:
# Das Skript speichert einmalig generierte Verzeichnislisten in einer
# Cache-Datei, um wiederholte Durchläufe zu beschleunigen. Der Cache kann
# bei Bedarf erneuert werden.
#
# 3) Benutzerinteraktion:
# Das Skript stellt Fragen zu den gefundenen Dateien und Ordnern, die
# vor der Löschung beantwortet werden müssen. Dabei werden nur 'y' oder 'n'
# als gültige Eingaben akzeptiert.
#
# 4) Sicherheit:
# Das Skript prüft vor jedem Löschvorgang, ob die angegebenen Dateien oder
# Ordner tatsächlich existieren. Nicht vorhandene Elemente werden übersprungen.
#
# 5) Protokollierung:
# Alle Löschvorgänge und andere Aktionen werden direkt im Terminal protokolliert.
#
# ---------------------------------------------
# Ablaufplan:
# ---------------------------------------------
# 1. Start:
# - Das Skript prüft das angegebene Zielverzeichnis.
# - Falls das Verzeichnis nicht existiert, wird das Skript mit einer Fehlermeldung beendet.
#
# 2. Cache-Management:
# - Das Skript prüft, ob eine Cache-Datei für das Zielverzeichnis existiert.
# - Wenn ja, wird der Benutzer gefragt, ob der Cache verwendet werden soll.
# - Andernfalls wird eine neue Verzeichnisliste generiert und im Cache gespeichert.
#
# 3. Hauptmenü:
# - Der Benutzer wird durch ein interaktives Menü geleitet, das folgende Optionen bietet:
# 1) RAR-Dateien und Verzeichnisse in '3D'-Ordnern prüfen und ggf. löschen.
# 2) Dateien und Verzeichnisse in 'Documentation'-Ordnern prüfen und löschen (nur .rar behalten).
# 3) Ordner mit 'Kopie' im Namen auflisten und ggf. löschen.
# 4) Ordner mit 'Nachscan' im Namen auflisten und ggf. löschen.
# 5) `.rar`-Dateien in den ersten zwei Verzeichnisebenen prüfen und ggf. löschen.
# 6) Beenden des Skripts.
#
# 4. Funktionsweise der einzelnen Optionen:
# - **Option 1:**
# Sucht nach '3D'-Ordnern und listet alle Inhalte auf. Der Benutzer wird gefragt, ob alle
# Inhalte (inklusive `.rar`-Dateien) gelöscht werden sollen.
# - **Option 2:**
# Sucht nach 'Documentation'-Ordnern. Alle Dateien und Unterordner außer `.rar`-Dateien
# können auf Wunsch gelöscht werden.
# - **Option 3:**
# Listet alle Ordner mit 'Kopie' im Namen auf. Der Benutzer entscheidet, ob jeder Ordner
# gelöscht werden soll.
# - **Option 4:**
# Listet alle Ordner mit 'Nachscan' im Namen auf. Der Benutzer entscheidet, ob jeder
# Ordner gelöscht werden soll.
# - **Option 5:**
# Prüft die ersten zwei Verzeichnisebenen des Zielverzeichnisses auf `.rar`-Dateien.
# Gefundene `.rar`-Dateien können gelöscht werden.
#
# 5. Cache-Aktualisierung:
# - Nach jedem Löschvorgang wird geprüft, ob die gelöschten Ordner noch in der Cache-Datei
# vorhanden sind. Falls ja, wird die Cache-Datei automatisch aktualisiert.
#
# 6. Beenden:
# - Wenn die Option "Beenden" gewählt wird, wird das Skript ordnungsgemäß beendet.
# - Offene Aktionen oder temporäre Daten werden gelöscht.
#
# ---------------------------------------------
# Erweiterungsmöglichkeiten:
# ---------------------------------------------
# - Integration von Protokolldateien zur langfristigen Nachverfolgung der Aktionen.
# - Erweiterung der Suchkriterien für spezifische Dateien oder Ordner.
# - Automatische Sicherung gelöschter Inhalte in einem separaten Verzeichnis.
# -----------------------------------------------------------
#!/bin/bash
# Standardpfad
DEFAULT_PATH="/mnt/synology/aufmasse/2024"
CACHE_FILE="/tmp/verz_checker_cache.txt"
# Zielverzeichnis prüfen und setzen
TARGET_DIR=${1:-$DEFAULT_PATH}
if [[ ! -d "$TARGET_DIR" ]]; then
echo "Fehler: Zielverzeichnis '$TARGET_DIR' existiert nicht."
exit 1
fi
# Cache-Datei an Zielverzeichnis anpassen
CACHE_FILE="/tmp/verz_checker_cache_$(echo "$TARGET_DIR" | md5sum | awk '{print $1}').txt"
generate_or_use_cache() {
if [[ -f "$CACHE_FILE" ]]; then
while true; do
echo -n "Möchten Sie die gespeicherte Ordnerliste verwenden? (y/n): " > /dev/tty
read -r use_cache < /dev/tty
case $use_cache in
[Yy]) echo "Verwende die gespeicherte Ordnerliste."; return ;;
[Nn]) echo "Generiere eine neue Ordnerliste..."; find "$TARGET_DIR" -type d > "$CACHE_FILE"; echo "Neue Ordnerliste gespeichert."; return ;;
*) echo "Ungültige Eingabe. Bitte 'y' oder 'n' eingeben." ;;
esac
done
else
echo "Generiere eine neue Ordnerliste..."
find "$TARGET_DIR" -type d > "$CACHE_FILE"
echo "Neue Ordnerliste gespeichert."
fi
}
check_root_rars() {
echo "Prüfe auf RAR-Dateien in der ersten Verzeichnisebene von '$TARGET_DIR'..."
# Suche nur nach RAR-Dateien im Stammverzeichnis
rar_files=$(find "$TARGET_DIR" -maxdepth 2 -type f -iname "*.rar")
if [[ -z "$rar_files" ]]; then
echo "Keine RAR-Dateien gefunden."
return
fi
# Zeige die gefundenen RAR-Dateien an
echo "Gefundene RAR-Dateien im Stammverzeichnis:"
echo "$rar_files"
# Frage den Benutzer, ob er die Dateien löschen möchte
while true; do
echo -n "Möchten Sie diese RAR-Dateien löschen? (y/n): " > /dev/tty
read -r choice < /dev/tty
case $choice in
[Yy])
# Lösche nur die gefundenen RAR-Dateien
echo "$rar_files" | xargs -d '\n' rm -v
echo "RAR-Dateien wurden gelöscht."
break
;;
[Nn])
echo "RAR-Dateien bleiben bestehen."
break
;;
*)
echo "Ungültige Eingabe. Bitte 'y' oder 'n' eingeben."
;;
esac
done
}
delete_folder_if_exists() {
local folder=$1
if [[ -d "$folder" ]]; then
echo "Lösche Ordner und alle Unterordner: $folder"
rm -rv "$folder"
else
echo "Überspringe: Ordner '$folder' existiert nicht mehr."
fi
}
process_3d_folders() {
echo "Prüfe '3D'-Ordner..."
grep -i "/3d$" "$CACHE_FILE" | while IFS= read -r dir; do
# Überspringen, wenn Ordner nicht existiert
if [[ ! -d "$dir" ]]; then
echo "Überspringe: Ordner '$dir' existiert nicht mehr."
continue
fi
rar_files=$(find "$dir" -maxdepth 1 -type f -iname "*.rar")
other_files=$(find "$dir" -mindepth 1 -type f -not -iname "*.rar")
subdirs=$(find "$dir" -mindepth 1 -type d)
if [[ -z "$rar_files" && -z "$other_files" && -z "$subdirs" ]]; then continue; fi
echo -e "\nVerarbeite 3D-Ordner: $dir"
[[ -n "$rar_files" ]] && echo "Gefundene RAR-Dateien:" && echo "$rar_files"
[[ -n "$other_files" ]] && echo "Andere Dateien:" && echo "$other_files"
[[ -n "$subdirs" ]] && echo "Unterordner:" && echo "$subdirs"
while true; do
echo -n "Möchten Sie alle Inhalte löschen (einschließlich .rar-Dateien)? (y/n): " > /dev/tty
read -r choice < /dev/tty
case $choice in
[Yy])
delete_folder_if_exists "$dir"
break ;;
[Nn]) echo "Inhalte bleiben bestehen."; break ;;
*) echo "Ungültige Eingabe. Bitte 'y' oder 'n' eingeben." ;;
esac
done
done
}
process_documentation_folders() {
echo "Prüfe 'Documentation'-Ordner..."
grep -i "/documentation$" "$CACHE_FILE" | while IFS= read -r dir; do
if [[ ! -d "$dir" ]]; then
echo "Überspringe: Ordner '$dir' existiert nicht mehr."
continue
fi
rar_files=$(find "$dir" -maxdepth 1 -type f -iname "*.rar")
other_files=$(find "$dir" -mindepth 1 -type f -not -iname "*.rar")
subdirs=$(find "$dir" -mindepth 1 -type d)
if [[ -z "$other_files" && -z "$subdirs" ]]; then continue; fi
echo -e "\nVerarbeite Documentation-Ordner: $dir"
[[ -n "$rar_files" ]] && echo "Gefundene RAR-Dateien:" && echo "$rar_files"
[[ -n "$other_files" ]] && echo "Andere Dateien:" && echo "$other_files"
[[ -n "$subdirs" ]] && echo "Unterordner:" && echo "$subdirs"
while true; do
echo -n "Nicht-RAR-Inhalte löschen? (y/n): " > /dev/tty
read -r choice < /dev/tty
case $choice in
[Yy])
delete_folder_if_exists "$dir"
break ;;
[Nn]) echo "Inhalte bleiben bestehen."; break ;;
*) echo "Ungültige Eingabe. Bitte 'y' oder 'n' eingeben." ;;
esac
done
done
}
process_copy_folders() {
echo "Prüfe Ordner mit 'Kopie'..."
grep -i "kopie" "$CACHE_FILE" | while IFS= read -r dir; do
if [[ ! -d "$dir" ]]; then
echo "Überspringe: Ordner '$dir' existiert nicht mehr."
continue
fi
echo "Gefunden: $dir"
while true; do
echo -n "Ordner löschen? (y/n): " > /dev/tty
read -r choice < /dev/tty
case $choice in
[Yy]) delete_folder_if_exists "$dir"; break ;;
[Nn]) echo "Bleibt."; break ;;
*) echo "Ungültige Eingabe." ;;
esac
done
done
}
process_nachscan_folders() {
echo "Prüfe Ordner mit 'Nachscan'..."
grep -i "nachscan" "$CACHE_FILE" | while IFS= read -r dir; do
if [[ ! -d "$dir" ]]; then
echo "Überspringe: Ordner '$dir' existiert nicht mehr."
continue
fi
echo "Gefunden: $dir"
while true; do
echo -n "Ordner löschen? (y/n): " > /dev/tty
read -r choice < /dev/tty
case $choice in
[Yy]) delete_folder_if_exists "$dir"; break ;;
[Nn]) echo "Bleibt."; break ;;
*) echo "Ungültige Eingabe." ;;
esac
done
done
}
main_menu() {
while true; do
echo -e "\nOptionen:"
echo "1) RAR-Dateien und Verzeichnisse in '3D'-Ordnern prüfen und ggf. löschen."
echo "2) Dateien und Verzeichnisse in 'Documentation'-Ordnern prüfen und löschen (nur .rar behalten)."
echo "3) Ordner mit 'Kopie' im Namen auflisten und ggf. löschen."
echo "4) Ordner mit 'Nachscan' im Namen auflisten und ggf. löschen."
echo "5) RAR-Dateien in der ersten Verzeichnisebene prüfen und ggf. löschen."
echo "6) Beenden."
echo -n "Wählen Sie eine Option (1-6): " > /dev/tty
read -r option < /dev/tty
case $option in
1) process_3d_folders ;;
2) process_documentation_folders ;;
3) process_copy_folders ;;
4) process_nachscan_folders ;;
5) check_root_rars ;;
6) echo "Beende Programm."; break ;;
*) echo "Ungültige Auswahl." ;;
esac
done
}
generate_or_use_cache
main_menu