Mit Unterverzeichnissen
This commit is contained in:
90
commit-interaktiv.sh
Normal file
90
commit-interaktiv.sh
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
### 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
|
||||||
@ -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 rekursiv aus Neu nach Archiv kopieren, falls sie nicht existieren
|
||||||
|
find Neu/ -type f | while read -r file; do
|
||||||
|
relative_path="${file#Neu/}"
|
||||||
|
target="Archiv/$relative_path"
|
||||||
|
|
||||||
# 1. Dateien aus Neu/ prüfen und nach Archiv/ kopieren
|
|
||||||
for file in Neu/*; do
|
|
||||||
[ -e "$file" ] || continue
|
|
||||||
base=$(basename "$file")
|
|
||||||
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
|
||||||
|
|||||||
Reference in New Issue
Block a user