Hallo liebe Community.
Heute geht es um Ordnersynchronisation. Dabei habe ich mir die Integration von OneDrive bei Windows 11 zum Vorbild genommen. Habe mich aber aus mehreren Gründen gegen OneDrive und für Google Drive entschieden. Zum einen hat Google Drive in den meisten Fällen wesentlich mehr Speicher zum anderen kann man dabei auch mit seinem Smartphone wie auch mit anderen Rechnern alle Dateien und auch Google Fotos synchronisieren. Es hat den Vorteil dass es auch gleichzeitig als Backup genutzt werden kann, für den Fall dass der Rechner mal neu aufgesetzt werden muss oder Dateien aus unvorhergesehenen Gründen zerschossen werden. Wer dennoch zusätzlich auch OneDrive als Laufwerk einhängen möchte kann dies mit folgender Videoanleitung tun.
Für die Synchronisation habe ich zwei Bash-Scripte geschrieben welche das Programm rclone nutzen. Dieses ist in dem Paketquellen vorhanden und kann mit apt install rclone installiert werden. Danach muss es mit rclone config konfiguriert werden. Als Remote-Name verwenden wir g-drive. Nun klicken wir auf weiter bis wir zur Auswahl des Anbieters kommen. Hierbei ist es unter Linux Mint die Nummer 13 für Google Drive. Danach klicken wir wieder auf weiter können alle Voreinstellungen so lassen und bei der Auswahl für die Zugriffsberechtigung vergeben wir die 1 für vollen Zugriff. Also das sowohl lesen als auch schreiben möglich ist. Danach öffnet sich der Browser und man wird um Bestätigung mit seinem Gmail-Konto gefragt. Damit ist die Konfiguration schon abgeschlossen und wir können uns den Skript zuwenden. Hierfür erstellen wir eine Datei und speichern diese unter den Namen sync-g_gdrive.sh ab. Und dieses Script speichern wir folgenden Inhalt:
#!/bin/bash
# rclone Syncronisationsscript für Google Drive
# Veröffentlicht unter der GNU General Public License Version 3.
# Erstellt von maik3531 25. Mai 2024
# Version 0.2
# Kopiere dieses Script in eine Datei und speichere es unter "sync_gdrive.sh"
# mache es ausfürbar mit "chmod +x sync_gdrive.sh" und starte es mit
# "./sync_gdrive.sh" für die normale Synchronisation oder
# "./sync_gdrive.sh -new" wenn auf Google Drive der altuelle Stand, deines local ausgewählten Ordners übertragen werden soll
# ( Achtung: Nicht vorhandene Dateien, werden auf Google Drive als Backup gespeichert und ebenfalls gelöscht! )
#--------------------------------------------------------
if ! command -v rclone > /dev/null 2>&1
then
echo "Dieses Script benötigt das Programm rclone"
echo "Bitte installieren Sie dieses mit 'apt install rclone'"
echo "Daraufhin führen Sie 'rclone config' aus und vergeben"
echo "den REMOTE-Name 'g-drive' für Google Drive, im letzten"
echo "Auswahlmenü geben vollen Lese- und Schreibzugriff (1)"
exit
fi
# Name der Remote-Verbindung zu Google Drive (wie in rclone config angegeben)
REMOTE_NAME="g-drive"
# Basispfad auf Google Drive
REMOTE_BASE_FOLDER="Persönlicher Ordner"
# Lokale Basisverzeichnis
LOCAL_BASE_FOLDER="$HOME"
# Ordneroptionen
# Ordnernamen können angepasst werden, je nachdem welche synchronisiert werden sollen
declare -A FOLDERS
FOLDERS=(
[1]="Bilder"
[2]="Dokumente"
[3]="Downloads"
[4]="Musik"
[5]="Öffentlich"
[6]="Schreibtisch"
[7]="Videos"
[8]="Vorlagen"
)
# Temporäre Log-Datei
LOG_FILE="/tmp/rclone_sync.log"
# Funktion zur Überprüfung und Erstellung von Verzeichnissen
check_and_create_dir() {
local FOLDER_PATH="$1"
if ! rclone lsf "$FOLDER_PATH" &>/dev/null; then
rclone mkdir "$FOLDER_PATH"
fi
}
# Funktion zur Analyse des Logs und Anzeige der Änderungen
show_changes_from_log() {
local LOG_FILE="$1"
echo ""
grep -E '(Moved|Copied)' "$LOG_FILE" | awk '{print $5}' | sed 's/:$//' | sort -u | while read -r file; do
echo -e "Die Datei \e[94m${FOLDERS[$choice]}/$file\e[0m wurde geändert"
done
}
# Funktion zur Überprüfung auf Rate-Limits
check_rate_limit_exceeded() {
local LOG_FILE="$1"
if grep -q 'RATE_LIMIT_EXCEEDED' "$LOG_FILE"; then
echo ""
echo "Synchronisation nicht möglich, da Google die tägliche Upload-Anzahl und Größe von Dateien ohne Client ID limitiert."
echo "Bitte Client ID erstellen oder zu einem späteren Zeitpunkt erneut versuchen."
exit 1
fi
}
# Funktion für die normale Synchronisation
normal_sync() {
local LOCAL_FOLDER="$1"
local REMOTE_FOLDER="$2"
local REMOTE_BACKUP_FOLDER="$3"
# Prüfe und erstelle erforderliche Verzeichnisse
check_and_create_dir "$REMOTE_NAME:$REMOTE_FOLDER"
check_and_create_dir "$REMOTE_NAME:$REMOTE_BACKUP_FOLDER"
# Erstelle das lokale Backup-Verzeichnis, falls es nicht existiert
mkdir -p "$LOCAL_BASE_FOLDER/local_backups"
# Leere die Log-Datei
: > "$LOG_FILE"
echo "Synchronisation von Google Drive zu lokalem Ordner:"
rclone copy "$REMOTE_NAME:$REMOTE_FOLDER" "$LOCAL_FOLDER" --backup-dir "$LOCAL_BASE_FOLDER/local_backups" --suffix ".$(date +'%Y-%m-%d_%H-%M')" --update --log-file "$LOG_FILE" --log-level INFO
check_rate_limit_exceeded "$LOG_FILE"
echo "Synchronisation von lokalem Ordner zu Google Drive:"
rclone copy "$LOCAL_FOLDER" "$REMOTE_NAME:$REMOTE_FOLDER" --backup-dir "$REMOTE_NAME:$REMOTE_BACKUP_FOLDER" --suffix ".$(date +'%Y-%m-%d_%H-%M')" --update --log-file "$LOG_FILE" --log-level INFO
check_rate_limit_exceeded "$LOG_FILE"
show_changes_from_log "$LOG_FILE"
# Lösche alte Dateien im lokalen Backup-Verzeichnis (älter als 14 Tage)
find "$LOCAL_BASE_FOLDER/local_backups" -type f -mtime +14 -delete
# Lösche leere lokale Backup-Verzeichnisse
find "$LOCAL_BASE_FOLDER/local_backups" -type d -empty -delete
# Lösche alte Dateien im Remote-Backup-Verzeichnis (älter als 14 Tage)
rclone delete --min-age 14d "$REMOTE_NAME:$REMOTE_BACKUP_FOLDER"
# Lösche leere Verzeichnisse auf Google Drive
rclone rmdirs "$REMOTE_NAME:$REMOTE_BACKUP_FOLDER" --leave-root
}
# Funktion für die Synchronisation, die den aktuellen Stand des Rechners übernimmt
sync_new() {
local LOCAL_FOLDER="$1"
local REMOTE_FOLDER="$2"
local REMOTE_BACKUP_FOLDER="$3"
# Prüfe und erstelle erforderliche Verzeichnisse
check_and_create_dir "$REMOTE_NAME:$REMOTE_FOLDER"
check_and_create_dir "$REMOTE_NAME:$REMOTE_BACKUP_FOLDER"
# Erstelle das lokale Backup-Verzeichnis, falls es nicht existiert
mkdir -p "$LOCAL_BASE_FOLDER/local_backups"
# Leere die Log-Datei
: > "$LOG_FILE"
echo ""
echo -e "\e[1;4mAchtung:\e[0m Nicht vorhandene Dateien werden auf Google Drive"
echo " als Backup gespeichert und ebenfalls gelöscht!"
rclone sync "$LOCAL_FOLDER" "$REMOTE_NAME:$REMOTE_FOLDER" --backup-dir "$REMOTE_NAME:$REMOTE_BACKUP_FOLDER" --suffix ".$(date +'%Y-%m-%d_%H-%M')" --log-file "$LOG_FILE" --log-level INFO
check_rate_limit_exceeded "$LOG_FILE"
show_changes_from_log "$LOG_FILE"
# Lösche alte Dateien im Remote-Backup-Verzeichnis (älter als 14 Tage)
rclone delete --min-age 14d "$REMOTE_NAME:$REMOTE_BACKUP_FOLDER"
# Lösche leere Verzeichnisse auf Google Drive
rclone rmdirs "$REMOTE_NAME:$REMOTE_BACKUP_FOLDER" --leave-root
}
# Menü zur Auswahl des zu synchronisierenden Ordners
clear
echo ""
echo "Bitte wähle den zu synchronisierenden 📁 Ordner aus:"
echo ""
for key in $(echo "${!FOLDERS[@]}" | tr ' ' '\n' | sort -n); do
echo "$key) ${FOLDERS[$key]}"
done
echo ""
read -p " Eingabe: " choice
LOCAL_FOLDER="${LOCAL_BASE_FOLDER}/${FOLDERS[$choice]}"
REMOTE_FOLDER="${REMOTE_BASE_FOLDER}/${FOLDERS[$choice]}"
REMOTE_BACKUP_FOLDER="${REMOTE_BASE_FOLDER}/old_versions/${FOLDERS[$choice]}"
# Prüfe den übergebenen Parameter
if [ "$1" == "-new" ]; then
echo ""
echo "Synchronisiere und übernehme den aktuellen Stand des Rechners..."
sync_new "$LOCAL_FOLDER" "$REMOTE_FOLDER" "$REMOTE_BACKUP_FOLDER"
else
echo ""
echo "Normale Synchronisation wird durchgeführt..."
normal_sync "$LOCAL_FOLDER" "$REMOTE_FOLDER" "$REMOTE_BACKUP_FOLDER"
fi
echo ""
echo "Synchronisation abgeschlossen."
echo ""
exit
# Hinweis: Dieses Skript benötigt Zugriff auf die rclone Konfiguration und Authentifizierung.
# Stelle sicher, dass du rclone korrekt konfiguriert und autorisiert hast.
# Optionen erklärt:
# --backup-dir: Gibt das Verzeichnis an, in das ältere Versionen der Dateien verschoben werden sollen.
# --suffix: Fügt einen Zeitstempel an die gesicherten Dateien an, um Versionskonflikte zu vermeiden.
# --update: Kopiere nur, wenn die Quell-Datei neuer ist als die Ziel-Datei oder die Ziel-Datei nicht existiert.
# --min-age: Löscht Dateien, die älter als die angegebene Zeitspanne sind.
# --leave-root: Verhindert, dass das Wurzelverzeichnis gelöscht wird, auch wenn es leer ist.
# --log-file: Spezifiziert eine Log-Datei für die Ausgaben.
# --log-level: Definiert das Ausgabeformat für die Protokollierung.
Display More
Nun machen wir es noch mit chmod +x sync_gdrive.sh ausführbar und können es über einen Terminal mit dem Befehl ./sync_gdrive.sh aufrufen.
Ich habe bei den Skript darauf geachtet dass immer auf die neueste Version einer Datei synchronisiert wird. Sollte auf Google Drive oder den lokalen Rechner eine Datei ersetzt werden wird hier von ein Backup erstellt. Wenn man den Befehl ./sync_gdrive.sh -new verwendet kann man den aktuellen Stand seines lokalen Ordners auf Google Drive übertragen, auch wenn die lokalen Dateien älter als die in Zielordner sind. Achtung: nicht vorhandene Dateien, werden auf Google Drive als Backup gesichert und ebenfalls gelöscht.
Anmerkung: Natürlich könnt ihr die Ordner in dem Script euren Ordnern anpassen z.b. anstelle von (Vorlagen) (Scripte) oder so.
Ich habe das Script auch mit Absicht mit Abfrage erstellt. Denn man möchte nicht immer automatisch den ganzen home Ordner synchronisieren. Falls gewünscht kann es ja angepasst werden oder ich stelle noch eine angepasste Version zum automatischen synchronisieren für z.B. Autostart oder Cron zur Verfügung.