Unison allows you to synchronize in both directions and builds on top of the tried and true rsync protocol. It's built to play well with file exchanges between Unix and Windows hosts. It also has a number of options that allow you to fine tune your sync or script the whole operation. There is a GUI version as well.
You can install it on Debian/Ubuntu with apt-get:
sudo apt-get install unison unison-gtk
In my daily use, I typically have several Nautilus .gvfs mounts to various Windows SMB/CIFS shares and SFTP hosts. Unison isn't directly aware of these Nautilus style mounts so I cobbled together this Nautilus script based on some examples I found at http://g-scripts.sourceforge.net.
Instructions
Copy the script to your ~/.gnome2/nautilus-scripts/ directory with the name unison-sync.sh.
Set the execute bit on the script.
Make sure zenity is installed.
sudo apt-get install zenity
With Nautilus, connect to a server resource using SMB or SFTP.
Right click on a remote directory and click scripts>unison-sync.sh.
A file directory dialog will appear. This allows you to select the local location you want to synchronize with the server.
Save the name of the Unison preference file.
Now run Unison from the terminal or the GUI.
unison pref_name
Note
My script enable auto approve for non-conflicts to save time. You might want to change that. It also disables permissions since Windows mounts don't support the same types as standard Linux file systems.
The unison-sync.sh script:
#!/bin/bash # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. # # author : # clayton.kramergmail.com # # description : # Provides a quick way of making Unison preference files from # Nautilus. # # informations : # - a script for use (only) with Nautilus. # - to use, copy to your ${HOME}/.gnome2/nautilus-scripts/ directory. # # WARNINGS : # - this script must be executable. # - package "zenity" must be installed # # THANKS : # This script was heavily sourced from the work of SLK. Having # Perl regex to parse .gvfs paths was a huge time saver. # # CONSTANTS # some labels used for zenity [en] z_title="Synchronize Folder" z_err_gvfs="cannot acces to directory - check gvfs\nEXIT" z_err_uri="cannot acces to directory - uri not known\nEXIT" # INIT VARIABLES # may depends of your system : (current settings for debian, ubuntu) GVFSMOUNT='/usr/bin/gvfs-mount' GREP='/bin/grep' IFCONFIG='/sbin/ifconfig' KILL='/bin/kill' LSOF='/usr/bin/lsof' PERL='/usr/bin/perl' PYTHON='/usr/bin/python2.5' SLEEP='/bin/sleep' ZENITY='/usr/bin/zenity' # MAIN export LANG=C # retrieve the first object selected or the current uri if [ "$NAUTILUS_SCRIPT_SELECTED_URIS" == "" ] ; then uri_first_object=`echo -e "$NAUTILUS_SCRIPT_CURRENT_URI" \ | $PERL -ne 'print;exit'` else uri_first_object=`echo -e "$NAUTILUS_SCRIPT_SELECTED_URIS" \ | $PERL -ne 'print;exit'` fi type_uri=`echo "$uri_first_object" \ | $PERL -pe 's~^(.+?)://.+$~$1~'` # try to get the full path of the uri (local path or gvfs mount ?) if [ $type_uri == "file" ] ; then filepath_object=`echo "$uri_first_object" \ | $PERL -pe ' s~^file://~~; s~%([0-9A-Fa-f]{2})~chr(hex($1))~eg'` elif [ $type_uri == "smb" -o $type_uri == "sftp" ] ; then if [ -x $GVFSMOUNT ] ; then # host (and share for smb) are matching a directory in ~/.gvfs/ host_share_uri=`echo "$uri_first_object" \ | $PERL -pe ' s~^(smb://.+?/.+?/).*$~$1~; s~^(sftp://.+?/).*$~$1~; '` path_gvfs=`${GVFSMOUNT} -l \ | $GREP "$host_share_uri" \ | $PERL -ne 'print/^.+?:\s(.+?)\s->.+$/'` # now let's create the local path path_uri=`echo "$uri_first_object" \ | $PERL -pe ' s~^smb://.+?/.+?/~~; s~^sftp://.+?/~~; s~%([0-9A-Fa-f]{2})~chr(hex($1))~eg'` filepath_object="${HOME}/.gvfs/${path_gvfs}/${path_uri}" else $ZENITY --error --title "$z_title" --width "320" \ --text="$z_err_gvfs" exit 1 fi else $ZENITY --error --title "$z_title" --width "320" \ --text="$z_err_uri" exit 1 fi if [ -d "${HOME}/.unison" ]; then # create the Unison user directory if it doesn't exist mkdir -p "${HOME}/.unison" fi # Select a local directory to sync with local_dir=`$ZENITY --title "$z_title" --file-selection --directory` # Provide an alias for the sync mount_name=`echo "$filepath_object" | perl -ne 'print/main on (\w*)\//'` base_name=`echo "$filepath_object" | perl -ne 'print/.*\/(.*)$/;'` alias="$mount_name-$base_name" alias=`$ZENITY --title "$z_title" --entry --text="Enter a name for this Unison preferences file." --entry-text="$alias"` alias="$alias.prf" # Write the Unison file echo "# Unison preferences file" > ${HOME}/.unison/$alias echo "root = $local_dir" >> ${HOME}/.unison/$alias echo "root = $filepath_object" >> ${HOME}/.unison/$alias echo "perms = 0" >> ${HOME}/.unison/$alias echo "dontchmod = true" >> ${HOME}/.unison/$alias echo "auto = true" >> ${HOME}/.unison/$alias exit 0 ### EOF
No comments:
Post a Comment