2016-08-06 00:12:27 +08:00
package copy
import (
2019-06-17 16:34:30 +08:00
"context"
2016-08-06 00:12:27 +08:00
"github.com/ncw/rclone/cmd"
2018-05-08 01:13:17 +08:00
"github.com/ncw/rclone/fs/operations"
2018-01-13 00:30:54 +08:00
"github.com/ncw/rclone/fs/sync"
2016-08-06 00:12:27 +08:00
"github.com/spf13/cobra"
)
2019-03-06 16:43:46 +08:00
var (
createEmptySrcDirs = false
)
2016-08-06 00:12:27 +08:00
func init ( ) {
2016-10-22 19:05:45 +08:00
cmd . Root . AddCommand ( commandDefintion )
2019-03-06 16:43:46 +08:00
commandDefintion . Flags ( ) . BoolVarP ( & createEmptySrcDirs , "create-empty-src-dirs" , "" , createEmptySrcDirs , "Create empty source dirs on destination after copy" )
2016-08-06 00:12:27 +08:00
}
2016-10-22 19:05:45 +08:00
var commandDefintion = & cobra . Command {
2016-08-06 00:12:27 +08:00
Use : "copy source:path dest:path" ,
Short : ` Copy files from source to dest, skipping already copied ` ,
Long : `
Copy the source to the destination . Doesn ' t transfer
unchanged files , testing by size and modification time or
MD5SUM . Doesn ' t delete files from the destination .
Note that it is always the contents of the directory that is synced ,
not the directory so when source : path is a directory , it ' s the
contents of source : path that are copied , not the directory name and
contents .
If dest : path doesn ' t exist , it is created and the source : path contents
go there .
For example
rclone copy source : sourcepath dest : destpath
Let ' s say there are two files in sourcepath
sourcepath / one . txt
sourcepath / two . txt
This copies them to
destpath / one . txt
destpath / two . txt
Not to
destpath / sourcepath / one . txt
destpath / sourcepath / two . txt
2016-10-24 00:34:17 +08:00
If you are familiar with ` + " ` rsync ` " + ` , rclone always works as if you had
2016-08-06 00:12:27 +08:00
written a trailing / - meaning "copy the contents of this directory" .
This applies to all commands and whether you are talking about the
source or destination .
2018-10-21 17:51:41 +08:00
2018-11-26 00:49:38 +08:00
See the [ -- no - traverse ] ( / docs / # no - traverse ) option for controlling
whether rclone lists the destination directory or not . Supplying this
option when copying a small number of files into a large destination
can speed transfers up greatly .
For example , if you have many files in / path / to / src but only a few of
them change every day , you can to copy all the files which have
changed recently very efficiently like this :
rclone copy -- max - age 24 h -- no - traverse / path / to / src remote :
2018-10-21 17:51:41 +08:00
* * Note * * : Use the ` + " ` - P ` " + ` / ` + " ` -- progress ` " + ` flag to view real - time transfer statistics
2016-08-06 00:12:27 +08:00
` ,
Run : func ( command * cobra . Command , args [ ] string ) {
cmd . CheckArgs ( 2 , 2 , command , args )
2018-05-08 01:13:17 +08:00
fsrc , srcFileName , fdst := cmd . NewFsSrcFileDst ( args )
2016-12-05 00:52:24 +08:00
cmd . Run ( true , true , command , func ( ) error {
2018-05-08 01:13:17 +08:00
if srcFileName == "" {
2019-06-17 16:34:30 +08:00
return sync . CopyDir ( context . Background ( ) , fdst , fsrc , createEmptySrcDirs )
2018-05-08 01:13:17 +08:00
}
2019-06-17 16:34:30 +08:00
return operations . CopyFile ( context . Background ( ) , fdst , fsrc , srcFileName , srcFileName )
2016-08-06 00:12:27 +08:00
} )
} ,
}