mirror of
https://github.com/rclone/rclone.git
synced 2024-11-26 10:25:03 +01:00
Add "--ignore-existing" flag.
Add option to completely ignore existing files and not consider them for transfer. Fixes #274
This commit is contained in:
parent
5189231a34
commit
25f22ec561
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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")
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user