Commit 1347d512 authored by Andrew Tridgell's avatar Andrew Tridgell

added --existing option, similar to one suggested by Gildas Quiniou <gildas@stip.fr>

parent 5d1e1dcf
...@@ -178,6 +178,7 @@ void recv_generator(char *fname,struct file_list *flist,int i,int f_out) ...@@ -178,6 +178,7 @@ void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
extern char *compare_dest; extern char *compare_dest;
extern int list_only; extern int list_only;
extern int preserve_perms; extern int preserve_perms;
extern int only_existing;
if (list_only) return; if (list_only) return;
...@@ -186,6 +187,12 @@ void recv_generator(char *fname,struct file_list *flist,int i,int f_out) ...@@ -186,6 +187,12 @@ void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
statret = link_stat(fname,&st); statret = link_stat(fname,&st);
if (only_existing && statret == -1 && errno == ENOENT) {
/* we only want to update existing files */
if (verbose > 1) rprintf(FINFO,"not creating %s\n",fname);
return;
}
if (statret == 0 && if (statret == 0 &&
!preserve_perms && !preserve_perms &&
(S_ISDIR(st.st_mode) == S_ISDIR(file->mode))) { (S_ISDIR(st.st_mode) == S_ISDIR(file->mode))) {
......
...@@ -63,6 +63,7 @@ int copy_unsafe_links=0; ...@@ -63,6 +63,7 @@ int copy_unsafe_links=0;
int block_size=BLOCK_SIZE; int block_size=BLOCK_SIZE;
int size_only=0; int size_only=0;
int delete_after=0; int delete_after=0;
int only_existing=0;
char *backup_suffix = BACKUP_SUFFIX; char *backup_suffix = BACKUP_SUFFIX;
char *tmpdir = NULL; char *tmpdir = NULL;
...@@ -125,6 +126,7 @@ void usage(int F) ...@@ -125,6 +126,7 @@ void usage(int F)
rprintf(F," -e, --rsh=COMMAND specify rsh replacement\n"); rprintf(F," -e, --rsh=COMMAND specify rsh replacement\n");
rprintf(F," --rsync-path=PATH specify path to rsync on the remote machine\n"); rprintf(F," --rsync-path=PATH specify path to rsync on the remote machine\n");
rprintf(F," -C, --cvs-exclude auto ignore files in the same way CVS does\n"); rprintf(F," -C, --cvs-exclude auto ignore files in the same way CVS does\n");
rprintf(F," --existing only update files that already exist\n");
rprintf(F," --delete delete files that don't exist on the sending side\n"); rprintf(F," --delete delete files that don't exist on the sending side\n");
rprintf(F," --delete-excluded also delete excluded files on the receiving side\n"); rprintf(F," --delete-excluded also delete excluded files on the receiving side\n");
rprintf(F," --delete-after delete after transferring, not before\n"); rprintf(F," --delete-after delete after transferring, not before\n");
...@@ -165,7 +167,7 @@ enum {OPT_VERSION, OPT_SUFFIX, OPT_SENDER, OPT_SERVER, OPT_EXCLUDE, ...@@ -165,7 +167,7 @@ enum {OPT_VERSION, OPT_SUFFIX, OPT_SENDER, OPT_SERVER, OPT_EXCLUDE,
OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS, OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS,
OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST, OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST,
OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS, OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
OPT_DELETE_AFTER}; OPT_DELETE_AFTER, OPT_EXISTING};
static char *short_options = "oblLWHpguDCtcahvqrRIxnSe:B:T:zP"; static char *short_options = "oblLWHpguDCtcahvqrRIxnSe:B:T:zP";
...@@ -173,6 +175,7 @@ static struct option long_options[] = { ...@@ -173,6 +175,7 @@ static struct option long_options[] = {
{"version", 0, 0, OPT_VERSION}, {"version", 0, 0, OPT_VERSION},
{"server", 0, 0, OPT_SERVER}, {"server", 0, 0, OPT_SERVER},
{"sender", 0, 0, OPT_SENDER}, {"sender", 0, 0, OPT_SENDER},
{"existing", 0, 0, OPT_EXISTING},
{"delete", 0, 0, OPT_DELETE}, {"delete", 0, 0, OPT_DELETE},
{"delete-excluded", 0, 0, OPT_DELETE_EXCLUDED}, {"delete-excluded", 0, 0, OPT_DELETE_EXCLUDED},
{"force", 0, 0, OPT_FORCE}, {"force", 0, 0, OPT_FORCE},
...@@ -320,6 +323,10 @@ int parse_arguments(int argc, char *argv[], int frommain) ...@@ -320,6 +323,10 @@ int parse_arguments(int argc, char *argv[], int frommain)
delete_mode = 1; delete_mode = 1;
break; break;
case OPT_EXISTING:
only_existing = 1;
break;
case OPT_DELETE_AFTER: case OPT_DELETE_AFTER:
delete_after = 1; delete_after = 1;
break; break;
...@@ -652,6 +659,9 @@ void server_options(char **args,int *argc) ...@@ -652,6 +659,9 @@ void server_options(char **args,int *argc)
if (numeric_ids) if (numeric_ids)
args[ac++] = "--numeric-ids"; args[ac++] = "--numeric-ids";
if (only_existing)
args[ac++] = "--existing";
if (tmpdir) { if (tmpdir) {
args[ac++] = "--temp-dir"; args[ac++] = "--temp-dir";
args[ac++] = tmpdir; args[ac++] = tmpdir;
......
...@@ -216,17 +216,6 @@ Here is a short summary of the options available in rsync. Please refer ...@@ -216,17 +216,6 @@ Here is a short summary of the options available in rsync. Please refer
to the detailed description below for a complete description. to the detailed description below for a complete description.
verb( verb(
Usage: rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
or rsync [OPTION]... [USER@]HOST:SRC DEST
or rsync [OPTION]... SRC [SRC]... DEST
or rsync [OPTION]... [USER@]HOST::SRC [DEST]
or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
SRC on single-colon remote HOST will be expanded by remote shell
SRC on server remote HOST may contain shell wildcards or multiple
sources separated by space as long as they have same top-level
Options
-v, --verbose increase verbosity -v, --verbose increase verbosity
-q, --quiet decrease verbosity -q, --quiet decrease verbosity
-c, --checksum always checksum -c, --checksum always checksum
...@@ -254,8 +243,10 @@ Options ...@@ -254,8 +243,10 @@ Options
-e, --rsh=COMMAND specify rsh replacement -e, --rsh=COMMAND specify rsh replacement
--rsync-path=PATH specify path to rsync on the remote machine --rsync-path=PATH specify path to rsync on the remote machine
-C, --cvs-exclude auto ignore files in the same way CVS does -C, --cvs-exclude auto ignore files in the same way CVS does
--existing only update files that already exist
--delete delete files that don't exist on the sending side --delete delete files that don't exist on the sending side
--delete-excluded also delete excluded files on the receiving side --delete-excluded also delete excluded files on the receiving side
--delete-after delete after transferring, not before
--partial keep partially transferred files --partial keep partially transferred files
--force force deletion of directories even if not empty --force force deletion of directories even if not empty
--numeric-ids don't map uid/gid values by user/group name --numeric-ids don't map uid/gid values by user/group name
...@@ -433,6 +424,9 @@ dit(bf(-x, --one-file-system)) This tells rsync not to cross filesystem ...@@ -433,6 +424,9 @@ dit(bf(-x, --one-file-system)) This tells rsync not to cross filesystem
boundaries when recursing. This is useful for transferring the boundaries when recursing. This is useful for transferring the
contents of only one filesystem. contents of only one filesystem.
dit(bf(--existing)) This tells rsync not to create any new files -
only update files that already exist on the destination.
dit(bf(--delete)) This tells rsync to delete any files on the receiving dit(bf(--delete)) This tells rsync to delete any files on the receiving
side that aren't on the sending side. Files that are excluded from side that aren't on the sending side. Files that are excluded from
transfer are excluded from being deleted unless you use --delete-excluded. transfer are excluded from being deleted unless you use --delete-excluded.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment