Compare commits

..

2 Commits

Author SHA1 Message Date
66f7fbb3c0 Aktualisierung 2025-06-25 14:11:40 +02:00
cff9f5cc12 Mit Unterverzeichnissen 2025-06-25 14:11:40 +02:00
2 changed files with 115 additions and 63 deletions

90
commit-interaktiv.sh Normal file
View File

@ -0,0 +1,90 @@
### 3 commit-interaktiv.sh (manuelle Nutzung)
#!/bin/bash
set -euo pipefail
cd "$(dirname "$0")"
LOGFILE="archiv.log"
TIMESTAMP() { date '+%Y-%m-%d %H:%M:%S'; }
log() {
echo "[$(TIMESTAMP)] $1" | tee -a "$LOGFILE"
}
RESTORE_SCRIPT="./restore-archiv.sh"
log "➔ Starte interaktive Archivierung..."
find Neu/ -type f | while read -r file; do
relative_path="${file#Neu/}"
target="Archiv/$relative_path"
base=$(basename "$file")
target_dir=$(dirname "$target")
mkdir -p "$target_dir"
if [ -e "$target" ]; then
echo "⚠️ Datei '$relative_path' existiert bereits im Archiv."
base_name="${base%.*}"
ext="${base##*.}"
if [ "$base_name" = "$ext" ]; then ext=""; else ext=".$ext"; fi
version=2
new_base="${base_name}_v${version}${ext}"
new_target="$target_dir/$new_base"
while [ -e "$new_target" ]; do
version=$((version + 1))
new_base="${base_name}_v${version}${ext}"
new_target="$target_dir/$new_base"
done
echo "Vorschlag zum Umbenennen: '$new_base'"
read -rp "▶️ Umbenennen? (j = ja, n = nein, sonst abbrechen): " answer
if [[ "$answer" =~ ^[Jj]$ ]]; then
cp "$file" "$new_target"
log "✅ '$file' → '$new_target' (umbenannt)"
elif [[ "$answer" =~ ^[Nn]$ ]]; then
read -rp "Neuer Dateiname eingeben (ohne Pfad): " user_input
[ -z "$user_input" ] && log "⚠️ Abbruch durch Benutzer." && continue
custom_target="$target_dir/$user_input"
if [ -e "$custom_target" ]; then
echo "⚠️ '$user_input' existiert ebenfalls. Übersprungen."
log "⚠️ '$file' nicht archiviert (Name doppelt)."
continue
fi
cp "$file" "$custom_target"
log "✅ '$file' → '$custom_target' (benutzerdefiniert)"
else
log "⚠️ Abbruch durch Benutzer."
continue
fi
else
cp "$file" "$target"
log "✅ '$file' → '$target'"
fi
done
# Aufräumen
find Neu/ -type f -delete
find Neu/ -mindepth 1 -type d -empty -delete
log "🛋 Neu-Verzeichnis aufgeräumt."
# Staging + Commit
git add --all
if git status --porcelain | grep . >/dev/null; then
if git commit -m "Manuelle Archivierung am $(TIMESTAMP)"; then
log "✅ Commit erfolgreich."
else
log "❌ Commit fehlgeschlagen. Starte Restore."
if [ -x "$RESTORE_SCRIPT" ]; then
"$RESTORE_SCRIPT"
log "♻️ Restore ausgeführt."
fi
fi
else
log "📥 Keine Änderungen zum Committen."
fi

View File

@ -1,3 +1,5 @@
### commit-wrapper.sh (für Cron)
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
@ -12,87 +14,47 @@ log() {
RESTORE_SCRIPT="./restore-archiv.sh" RESTORE_SCRIPT="./restore-archiv.sh"
log "➡️ Starte Archivierungslauf..." log " Starte Archivierungslauf (cron-tauglich, rekursiv)..."
# 1. Dateien aus Neu/ prüfen und nach Archiv/ kopieren # 1. Dateien rekursiv aus Neu nach Archiv kopieren, falls sie nicht existieren
for file in Neu/*; do find Neu/ -type f | while read -r file; do
[ -e "$file" ] || continue relative_path="${file#Neu/}"
base=$(basename "$file") target="Archiv/$relative_path"
target="Archiv/$base"
if [ -e "$target" ]; then if [ -e "$target" ]; then
log "⚠️ Datei '$base' existiert bereits im Archiv. Archivierung abgebrochen." log "⚠️ Datei '$relative_path' existiert bereits im Archiv. Übersprungen."
echo "⚠️ Datei '$base' existiert bereits im Archiv! Bitte umbenennen oder löschen." continue
exit 1
fi fi
done
# Kopieren & Löschen mkdir -p "$(dirname "$target")"
for file in Neu/*; do
[ -e "$file" ] || continue
base=$(basename "$file")
target="Archiv/$base"
cp "$file" "$target" cp "$file" "$target"
log "✅ '$base' nach Archiv kopiert." log "✅ '$file' nach '$target' kopiert."
done
for file in Neu/*; do
[ -e "$file" ] || continue
base=$(basename "$file")
rm "$file" rm "$file"
log "🧹 '$base' aus Neu gelöscht." log "🛋 '$file' gelöscht."
done done
# 2. Änderungen vormerken (inkl. Löschungen) # 2. Aufräumen leerer Unterverzeichnisse, aber nicht Neu/ selbst
# Änderungen vollständig vormerken (auch neue Dateien) find Neu/ -mindepth 1 -type d -empty -delete
# 3. Alles zum Commit vormerken
git add --all git add --all
log "📝 Alle Änderungen vorgemerkt (git add --all)." log "📍 Alle Änderungen vorgemerkt."
# Prüfen, ob es Änderungen gibt (gestaged oder nicht) # 4. Commit-Versuch
if git status --porcelain | grep . >/dev/null; then if git status --porcelain | grep . >/dev/null; then
# es gibt Änderungen, Commit starten if git commit -m "Archivierung automatisch am $(TIMESTAMP)"; then
if git commit -m "Archivierung von Dateien aus Neu am $(TIMESTAMP)"; then
log "✅ Commit erfolgreich." log "✅ Commit erfolgreich."
else else
# Commit fehlgeschlagen: Restore ausführen ... log "❌ Commit fehlgeschlagen. Starte Restore."
log "❌ Commit fehlgeschlagen. Versuche Archiv wiederherzustellen..."
echo "⚠️ Commit abgebrochen, da Änderungen im Archiv blockiert wurden."
if [ -x "$RESTORE_SCRIPT" ]; then if [ -x "$RESTORE_SCRIPT" ]; then
"$RESTORE_SCRIPT" "$RESTORE_SCRIPT"
log "♻️ Archiv wurde automatisch wiederhergestellt." log "♻️ Restore ausgeführt."
echo " Archiv wurde auf den letzten Commit zurückgesetzt."
else else
log " Restore-Skript '$RESTORE_SCRIPT' nicht gefunden oder nicht ausführbar!" log "⚠️ Restore-Skript nicht gefunden."
echo "⚠️ Restore-Skript nicht gefunden oder nicht ausführbar!"
fi fi
exit 1 exit 1
fi fi
else else
log "📭 Keine Änderungen zum Committen." log "📥 Keine Änderungen zum Committen."
echo "Keine Änderungen zum Committen."
exit 0
fi
# 3. Commit versuchen
if git diff --cached --quiet; then
log "📭 Keine Änderungen zum Committen."
echo "Keine Änderungen zum Committen."
exit 0
else
if git commit -m "Archivierung von Dateien aus Neu am $(TIMESTAMP)"; then
log "✅ Commit erfolgreich."
exit 0
else
log "❌ Commit fehlgeschlagen. Versuche Archiv wiederherzustellen..."
echo "⚠️ Commit abgebrochen, da Änderungen im Archiv blockiert wurden."
if [ -x "$RESTORE_SCRIPT" ]; then
"$RESTORE_SCRIPT"
log "♻️ Archiv wurde automatisch wiederhergestellt."
echo " Archiv wurde auf den letzten Commit zurückgesetzt."
else
log "❌ Restore-Skript '$RESTORE_SCRIPT' nicht gefunden oder nicht ausführbar!"
echo "⚠️ Restore-Skript nicht gefunden oder nicht ausführbar!"
fi
exit 1
fi
fi fi