X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/fd8571c2c9620ea5e637e5da369c48fd5f664294..4c599711942edaad7c69f6e19387729586e8bbea:/support/mnt-excl diff --git a/support/mnt-excl b/support/mnt-excl new file mode 100755 index 00000000..7597f63c --- /dev/null +++ b/support/mnt-excl @@ -0,0 +1,35 @@ +#!/usr/bin/perl -w +# This script takes a command-line arg of a source directory +# that will be passed to rsync, and generates a set of excludes +# that will exclude all mount points from the list. This is +# useful if you have "bind" mounts since the --one-file-system +# option won't notice the transition to a different spot on +# the same disk. For example: +# +# mnt-excl /dir | rsync --exclude-from=- ... /dir /dest/ +# mnt-excl /dir/ | rsync --exclude-from=- ... /dir/ /dest/ +# +# Imagine that /dir/foo is a mount point: the first invocation of +# mnt-excl would have output /dir/foo, while the second would have +# output /foo (which are the properly anchored excludes). +# +# NOTE: This script expects /proc/mounts to exist, but could be +# easily adapted to read /etc/mtab or similar. + +use strict; +use Cwd 'abs_path'; + +my $dir = shift || '/'; +$dir = abs_path($dir); +$dir =~ s#([^/]*)$##; +my $trailing = $1; +$trailing = '' if $trailing eq '.' || !-d "$dir$trailing"; +$trailing .= '/' if $trailing ne ''; + +open(IN, '/proc/mounts') or die $!; +while () { + $_ = (split)[1]; + next unless s#^\Q$dir$trailing\E##o && $_ ne ''; + print "- /$trailing$_\n"; +} +close IN;