Add "--ignore-existing" flag.

Add option to completely ignore existing files and not consider them for transfer.

Fixes #274
This commit is contained in:
klauspost 2016-01-05 11:35:36 +01:00 committed by Nick Craig-Wood
parent 5189231a34
commit 25f22ec561
4 changed files with 42 additions and 0 deletions

View File

@ -253,6 +253,15 @@ modification times in the same way as rclone.
When using this flag, rclone won't update mtimes of remote files if When using this flag, rclone won't update mtimes of remote files if
they are incorrect as it would normally. they are incorrect as it would normally.
### --ignore-existing ###
Using this option will make rclone unconditionally skip all files
that exist on the destination, no matter the content of these files.
While this isn't a generally recommended option, it can be useful
in cases where your files change due to encryption. However, it cannot
correct partial transfers in case a transfer was interrupted.
### --stats=TIME ### ### --stats=TIME ###
Rclone will print stats at regular intervals to show its progress. Rclone will print stats at regular intervals to show its progress.

View File

@ -62,6 +62,7 @@ var (
configFile = pflag.StringP("config", "", ConfigPath, "Config file.") configFile = pflag.StringP("config", "", ConfigPath, "Config file.")
checkSum = pflag.BoolP("checksum", "c", false, "Skip based on checksum & size, not mod-time & size") checkSum = pflag.BoolP("checksum", "c", false, "Skip based on checksum & size, not mod-time & size")
sizeOnly = pflag.BoolP("size-only", "", false, "Skip based on size only, not mod-time or checksum") sizeOnly = pflag.BoolP("size-only", "", false, "Skip based on size only, not mod-time or checksum")
ignoreExisting = pflag.BoolP("ignore-existing", "", false, "Skip all files that exist on destination")
dryRun = pflag.BoolP("dry-run", "n", false, "Do a trial run with no permanent changes") dryRun = pflag.BoolP("dry-run", "n", false, "Do a trial run with no permanent changes")
connectTimeout = pflag.DurationP("contimeout", "", 60*time.Second, "Connect timeout") connectTimeout = pflag.DurationP("contimeout", "", 60*time.Second, "Connect timeout")
timeout = pflag.DurationP("timeout", "", 5*60*time.Second, "IO idle timeout") timeout = pflag.DurationP("timeout", "", 5*60*time.Second, "IO idle timeout")
@ -168,6 +169,7 @@ type ConfigInfo struct {
DryRun bool DryRun bool
CheckSum bool CheckSum bool
SizeOnly bool SizeOnly bool
IgnoreExisting bool
ModifyWindow time.Duration ModifyWindow time.Duration
Checkers int Checkers int
Transfers int Transfers int
@ -261,6 +263,7 @@ func LoadConfig() {
Config.ConnectTimeout = *connectTimeout Config.ConnectTimeout = *connectTimeout
Config.CheckSum = *checkSum Config.CheckSum = *checkSum
Config.SizeOnly = *sizeOnly Config.SizeOnly = *sizeOnly
Config.IgnoreExisting = *ignoreExisting
Config.DumpHeaders = *dumpHeaders Config.DumpHeaders = *dumpHeaders
Config.DumpBodies = *dumpBodies Config.DumpBodies = *dumpBodies
Config.InsecureSkipVerify = *skipVerify Config.InsecureSkipVerify = *skipVerify

View File

@ -281,6 +281,11 @@ func checkOne(pair ObjectPair, out ObjectPairChan) {
if !src.Storable() { if !src.Storable() {
return return
} }
// If we should ignore existing files, don't transfer
if Config.IgnoreExisting {
Debug(src, "Destination exists, skipping")
return
}
// Check to see if changed or not // Check to see if changed or not
if Equal(src, dst) { if Equal(src, dst) {
Debug(src, "Unchanged skipping") Debug(src, "Unchanged skipping")

View File

@ -294,6 +294,31 @@ func TestSyncSizeOnly(t *testing.T) {
cleanTempDir(t) cleanTempDir(t)
} }
func TestSyncIgnoreExisting(t *testing.T) {
WriteFile("existing", "potato", t1)
fs.Config.IgnoreExisting = true
defer func() { fs.Config.IgnoreExisting = false }()
err := fs.Sync(fremote, flocal)
if err != nil {
t.Fatalf("Sync failed: %v", err)
}
items := []fstest.Item{
{Path: "existing", Size: 6, ModTime: t1, Md5sum: "8ee2027983915ec78acc45027d874316"},
}
fstest.CheckListingWithPrecision(t, flocal, items, fs.Config.ModifyWindow)
fstest.CheckListingWithPrecision(t, fremote, items, fs.Config.ModifyWindow)
// Change everything
WriteFile("existing", "newpotatoes", t2)
err = fs.Sync(fremote, flocal)
if err != nil {
t.Fatalf("Sync failed: %v", err)
}
// Items should not change
fstest.CheckListingWithPrecision(t, fremote, items, fs.Config.ModifyWindow)
cleanTempDir(t)
}
func TestSyncAfterChangingModtimeOnly(t *testing.T) { func TestSyncAfterChangingModtimeOnly(t *testing.T) {
WriteFile("empty space", "", t1) WriteFile("empty space", "", t1)