File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / rsync / support / mnt-excl
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 00:32:36 2021 UTC (3 years, 4 months ago) by misho
Branches: rsync, MAIN
CVS tags: v3_2_3, HEAD
rsync 3.2.3

    1: #!/usr/bin/env perl
    2: # This script takes a command-line arg of a source directory
    3: # that will be passed to rsync, and generates a set of excludes
    4: # that will exclude all mount points from the list.  This is
    5: # useful if you have "bind" mounts since the --one-file-system
    6: # option won't notice the transition to a different spot on
    7: # the same disk.  For example:
    8: #
    9: # mnt-excl /dir | rsync --exclude-from=- ... /dir /dest/
   10: # mnt-excl /dir/ | rsync --exclude-from=- ... /dir/ /dest/
   11: # ssh host mnt-excl /dir | rsync --exclude-from=- ... host:/dir /dest/
   12: #
   13: # Imagine that /dir/foo is a mount point: the first invocation of
   14: # mnt-excl would have output /dir/foo, while the second would have
   15: # output /foo (which are the properly anchored excludes).
   16: #
   17: # NOTE:  This script expects /proc/mounts to exist, but could be
   18: # easily adapted to read /etc/mtab or similar.
   19: #
   20: # ADDENDUM:  The addition of the --filter option (which has support for
   21: # absolute-anchored excludes) can make this script unneeded in some
   22: # scenarios.  If you don't need delete protection on the receiving side
   23: # (or if the destination path is identical to the source path), then you
   24: # can exclude some absolute paths from the transfer based on the mount
   25: # dirs.  For instance:
   26: #
   27: # awk '{print $2}' /proc/mounts | grep -v '^/$' | \
   28: #   rsync -avf 'merge,/- -' /dir host:/dest/
   29: 
   30: use strict;
   31: use warnings;
   32: use Cwd 'abs_path';
   33: 
   34: my $file = '/proc/mounts';
   35: my $dir = shift || '/';
   36: my $trailing_slash = $dir =~ m{./$} ? '/' : '';
   37: $dir = abs_path($dir) . $trailing_slash;
   38: $dir =~ s{([^/]*)$}{};
   39: my $trailing = $1;
   40: $trailing = '' if $trailing eq '.' || !-d "$dir$trailing";
   41: $trailing .= '/' if $trailing ne '';
   42: 
   43: open(IN, $file) or die "Unable to open $file: $!\n";
   44: while (<IN>) {
   45:     $_ = (split)[1];
   46:     next unless s{^\Q$dir$trailing\E}{}o && $_ ne '';
   47:     print "- /$trailing$_\n";
   48: }
   49: close IN;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>