310 lines
12 KiB
Bash
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
|