On 8/8/07, Akshay Kulkarni <akshayk_iitb@yahoo.co.in>
wrote:> I want to transfer a bunch of files, and then delete only those files
> from the source that match a certain pattern. It would be nice to have a
> filter rule to specify include and exclude patterns for the
> --remove-sent-files option. As far as I know, currently there is no such
> rule. The way I'm doing it is, I first transfer those files which I
> don't want to delete from the source after transfer, and then, using
> --remove-sent-files, transfer those that I want to delete. This requires
> running rsync twice.
Yes, it might be nice to have filter rules for --remove-sent-files,
but to me it seems to be a minor case. Running rsync twice is a
decent solution. Another option is to have rsync log the files it
transfers and have another program read the output and delete
whichever of the files ought to be deleted. For example, you could
run:
rsync -r src/ dest/ -vv --out-format='xfer %b %n' |
./my-remove-sent-files
Where ./my-remove-sent-files is this Perl script:
#!/usr/bin/env perl
while (<STDIN>) {
print;
chomp;
if (/^(.*) is uptodate$/ or /^xfer \d+ (.*)$/) {
my $f = $1;
# Substitute your pattern(s) here!
if ($f =~ /\.c$/) {
# Substitute your source directory here!
if (unlink("src/$f")) {
print "Deleted source file $f\n";
} else {
print "Failed to delete source file $f: $!\n";
}
}
}
}
The purpose of the %b is to force rsync to log transfers after they
succeed to avoid deleting a source file that was partially or
unsuccessfully transferred.
Matt