Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
en:linux:backup:full-rsync [2012/06/14 02:06]
alex
en:linux:backup:full-rsync [2019/04/18 10:02]
alex [Full system rsync]
Line 11: Line 11:
   * ''​include_dir''​ : included directories. ​ Subfolders of excluded directories to include.  ​   * ''​include_dir''​ : included directories. ​ Subfolders of excluded directories to include.  ​
  
-If you want to use this script with a remote host, change flags to+If you want to use this script with a remote host where the target user is not root, change flags to
  
 <​code>​ <​code>​
-flags="-avPse ssh --delete --rsync-path=\"rsync --fake-super\""+flags=(-avPse ssh --delete ​--ignore-errors ​--rsync-path="​rsync --fake-super"​)
 </​code>​ </​code>​
  
Line 24: Line 24:
 set -f set -f
  
-hostname=$(uname -n)+hostname=$(hostname ​-s)
 target="​my-hostname"​ target="​my-hostname"​
  
 source_dir="/"​ source_dir="/"​
 target_dir="/​media/​external-hard-drive/​$target/"​ target_dir="/​media/​external-hard-drive/​$target/"​
-exclude_dir="*/.gvfs /media /run/media /sys /dev /proc /mnt /tmp pagefile.sys hiberfil.sys /​home/​*/​.cache .mozilla/​firefox/​*/​Cache .Trash-1000" +exclude_dir=(*/.gvfs /media /run/media /sys /dev /proc /mnt /tmp pagefile.sys hiberfil.sys /​home/​*/​.cache .mozilla/​firefox/​*/​Cache .Trash-1000) 
-include_dir="/​mnt/​linux-data/​opt /mnt/data" +include_dir=(/​mnt/​linux-data/​opt /mnt/data) 
-flags="-avP --delete"+flags=(-avPAX --delete ​--ignore-errors)
  
 if [ -n "​$target"​ ] ; then if [ -n "​$target"​ ] ; then
Line 40: Line 40:
 fi fi
  
-include=""​+include=()
  
 # process include directories # process include directories
-for d in $include_dir+for d in "${include_dir[@]}"
 do do
   found=0   found=0
   dir=""​   dir=""​
-  ​exc_dir=""​ +  ​shortest_parent="/" 
-  ​shortest_parent=""​ + 
-  +  ​echo include_dir $d 
   # Need to deal with rsync idiosyncracies   # Need to deal with rsync idiosyncracies
   # by including excluded directories   # by including excluded directories
Line 55: Line 56:
   # Removes matches to the include directory   # Removes matches to the include directory
   # and finds the shortest parent path   # and finds the shortest parent path
-  for d2 in $exclude_dir+  for d2 in "${exclude_dir[@]}"
   do   do
 +    echo exclude_dir $d2
 +  ​
     if [[ $d = $d2* ]]; then     if [[ $d = $d2* ]]; then
       found=1       found=1
-      ​ + 
-      if [[ -z "​$shortest_parent"​ ]]; then+      if [[ "​$shortest_parent" == "/" ]]; then
         shortest_parent=$d2         shortest_parent=$d2
       else       else
Line 67: Line 70:
         fi         fi
       fi       fi
-      ​ 
-    else 
-      exc_dir="​$exc_dir $d2" 
     fi     fi
 +    echo shortest_parent $shortest_parent
   done   done
-  ​+
   if [[ $found ]]; then   if [[ $found ]]; then
-    ​exclude_dir=$exc_dir +    ​path=$(dirname "​$d"​)
-    path=`dirname "​$d"​`+
     while [[ "​$path"​ != "/"​ ]]; do     while [[ "​$path"​ != "/"​ ]]; do
-      exclude_dir="​$exclude_dir ​$path/​*"​ +      exclude_dir+=("​$path/​*"​) 
-      ​#​include_dir="$include_dir ​$path"​ +      ​include+=("--include=$path") 
-      ​include="$include --include ​$path"​ +      ​if [[ "​$path" ​== "​$shortest_parent"​ ]]; then 
-      path=`dirname "​$path"​`+        break 
 +      fi 
 +      path=$(dirname "​$path"​)
     done     done
   fi   fi
-  ​ + 
-  include="​$include ​--include $d"+  include+=("​--include=$d")
 done done
  
-exclude=""​+exclude=()
  
-for d in $exclude_dir+for d in "${exclude_dir[@]}"
 do do
-  exclude="​$exclude ​--exclude $d"+  exclude+=("​--exclude=$d")
 done done
  
-sudo -E rsync $flags $include $exclude "​$source_dir"​ "​$target_dir"​+sudo -E rsync "${flags[@]}" "${include[@]}" "${exclude[@]}" ​"​$source_dir"​ "​$target_dir"​
  
 </​code>​ </​code>​