Vermoedelijk kent zo ongeveer iedereen wel de problemen met het synchroon houden van documenten over meerdere locaties, vaak met behulp van bijvoorbeeld een usb-stick. Tot nu toe deed ik dit meestal allemaal handmatig, want wat te lui om goede rsync scripts te maken. ps: veel mensen ervaren overigens unison handiger dan rsync voor dit soort dingen.
Anyway, tijdens het werken met Dolphin, de standaard bestandsbeheer applicatie van KDE4, viel me op dat hier onder de rechtermuisknop een item aanwezig was: Actions, met daarin bijvoorbeeld de mogelijkheid een directory te comprimeren.. Zou hier niet een mogelijkheid zijn om een optie aan te maken: Synchroniseer Folder ?
Na wat Google werk, besloot ik dat dit script wel een goede basis zou kunnen zijn. Dus aan de slag !
Benodigdheden
De utility rsync staat standaard geinstalleerd, nu alleen nog KDialog om grafische schermen mee te maken. Onder OpenSUSE 11 kun je deze eenvoudig installeren door in een terminal uit te voeren:
sudo zypper install kde4-kdialog
Dolphin Actions
Het was nog een hele opgave om uit te zoeken waar je nu precies die Action menu-items aanmaakt, de zoektocht werd ook nog bemoeilijkt doordat dit niet juist in het Dolphin Handboek staat.. Ik weet ook niet hoe distributie-onhankelijk dit is, maar voor OpenSUSE 11 en Mandriva 2009 is de lokatie /usr/share/kde4/services/ServiceMenus. Hierin maken we een bestand aan, syncfolder.desktop met de volgende inhoud:
[Desktop Entry] X-SuSE-translate=false Type=Service X-KDE-ServiceTypes=KonqPopupMenu/Plugin,inode/directory Actions=syncdir; [Desktop Action syncdir] Name=Synchronize Folder Icon=kget Exec=/usr/local/bin/syncfolder.sh %u
De volgende keer dat je Dolphin opstart zal het menu-item aanwezig zijn. Ik ga in dit document niet op de details van dit bestand in, maar 2 zaken zijn belangrijk:
- Met X-KDE-ServiceTypes geef ik aan dat ik het wil menu item alleen wil toepassen op directories
- Achter de script naam bij Exec staat een %u, deze variabele staat voor de directory naam die je hebt aangeklikt met de rechtermuisknop.
Synchroniseren
We maken nu een script aan, /usr/local/bin/syncfolder.sh:
#!/bin/sh folder=$1 doeldir=`kdialog --getexistingdirectory /media` qdbusRef=`kdialog --progressbar "Synchronisatie voortgang"` qdbus $qdbusRef showCancelButton true for i in `find $folder -name '*' -type d` do qdbus $qdbusRef setLabelText "Synchroniseer $i naar $doeldir" echo "--------------------------------------" echo "$i ==> $doeldir" inc=$((`qdbus $qdbusRef org.freedesktop.DBus.Properties.Set org.kde.kdialog.ProgressDialog value` + 1)) sleep 2 if [ -e $i ]; then qdbus $qdbusRef $inc RSCMD="rsync --recursive --times --delete-during --stats --human-readable -h $i $doeldir" echo $RSCMD $RSCMD qdbus $qdbusRef setLabelText "Synchronisatie $i gereed" else qdbus $qdbusRef $inc echo "ERROR" fi echo "=======================================" sleep 2 done qdbus $qdbusRef close
Ook hier wil ik verder niet al te diep op ingaan, hooguit: qdbus is de vervanging voor dcop, maar werkt eigenlijk op een zelfde manier
Tenslotte
Dit document wil vooral gewoon een oplossing geven, niet alle parameters verklaren etc. Maar het geeft hopelijk ook aan dat je met kdialog en qdbus een heleboel gave dingen kan doen ! Hier zullen zeker nog diverse documenten aan gewijd worden.





