← Roccodrom

📄 nb-move: Notebook Cross-Linker

Dieses Bash-Skript ermöglicht das nahtlose Verschieben von Notizen zwischen verschiedenen nb-Notebooks (Git-Repositories), ohne dabei die verknüpften Medien zu verlieren.

🎯 Zweck

In einem digitalen Garten wachsen Inhalte manchmal aus ihrer ursprünglichen Kategorie heraus. Ein technisches Experiment am Yamaha FB-01 startet vielleicht in tech.git, wird aber später Teil einer Dokumentation in music.git. nb-move automatisiert diesen Transfer inklusive der Git-Historie und aller Anhänge.

🛠 Funktionen

📋 Voraussetzungen

🚀 Nutzung

  1. Skript im Terminal aufrufen: ./nb-move.sh
  2. Quelle wählen: Notebook aussuchen, in dem die Datei aktuell liegt.
  3. Datei wählen: Über die fzf-Suche die gewünschte .md Datei auswählen.
  4. Ziel wählen: Das neue Heimat-Notebook festlegen.
  5. Abschluss: Das Skript verschiebt die Daten lokal und synchronisiert beide Repositories sofort mit dem Server.

⚠️ Sicherheit & Kompatibilität


💻 Der Code (nb-move.sh)

Klicken zum Ausklappen des Quellcodes
#!/bin/bash

# --- KONFIGURATION ---
BASE_DIR="$HOME/storage/shared/notes"

# 1. Automatische Erkennung aller Repositories
mapfile -t ALL_REPOS < <(find "$BASE_DIR" -maxdepth 2 -name ".git" -type d -exec dirname {} \; | xargs -n1 basename | sort)

if [ ${#ALL_REPOS[@]} -eq 0 ]; then
    echo "❌ Keine Notebook-Repositories in $BASE_DIR gefunden!"
    exit 1
fi

# 2. Quell-Repository auswählen
echo "--- Quelle wählen ---"
PS3="Aus welchem Notebook stammt die Datei? "
select SOURCE_NAME in "${ALL_REPOS[@]}"; do
    if [ -n "$SOURCE_NAME" ]; then
        SOURCE_DIR="$BASE_DIR/$SOURCE_NAME"
        break
    else
        echo "Ungültige Auswahl."
    fi
done

# 3. Datei im Quell-Repo auswählen
cd "$SOURCE_DIR" || exit
FILE=$(find . -maxdepth 2 -name "*.md" | sed 's|^\./||' | fzf --header="Datei aus $SOURCE_NAME wählen")
[ -z "$FILE" ] && exit

# 4. Ziel-Repository auswählen
echo -e "\n--- Ziel wählen ---"
PS3="Wohin soll '$FILE' verschoben werden? "
mapfile -t TARGET_REPOS < <(for r in "${ALL_REPOS[@]}"; do [[ "$r" != "$SOURCE_NAME" ]] && echo "$r"; done)

select TARGET_NAME in "${TARGET_REPOS[@]}"; do
    if [ -n "$TARGET_NAME" ]; then
        TARGET_DIR="$BASE_DIR/$TARGET_NAME"
        break
    else
        echo "Ungültige Auswahl."
    fi
done

# 5. Sicherheits-Check
if [ -f "$TARGET_DIR/$FILE" ]; then
    echo "⚠️ Fehler: '$FILE' existiert bereits in $TARGET_NAME! Abbruch."
    exit 1
fi

# 6. Medien-Scan
echo "🔍 Scanne Medienlinks in $FILE..."
RES_FILES=$(grep -oE '_res/[a-zA-Z0-9._-]+' "$FILE" | sort -u)

# 7. Verschiebe-Aktion
mkdir -p "$TARGET_DIR/_res"

if [ -n "$RES_FILES" ]; then
    while read -r res_path; do
        if [ -f "$res_path" ]; then
            echo "📦 Verschiebe Medium: $res_path"
            mv "$res_path" "$TARGET_DIR/_res/"
        fi
    done <<< "$RES_FILES"
fi

mv "$FILE" "$TARGET_DIR/"

# 8. Git-Sync Quell-Repo
git rm "$FILE" 2>/dev/null
git add -u
git commit -m "Verschoben nach $TARGET_NAME: $FILE"
git push origin master

# 9. Git-Sync Ziel-Repo
cd "$TARGET_DIR"
git add .
git commit -m "Empfangen aus $SOURCE_NAME: $FILE"
git push origin master

echo -e "\n✅ Erfolgreich von $SOURCE_NAME nach $TARGET_NAME verschoben!"

Teil des Roccodrom-Workflows – Handwerk, Klang und Code.