2016-08-05 16:12:27 +00:00
package copy
import (
2019-06-17 08:34:30 +00:00
"context"
2019-07-28 17:47:38 +00:00
"github.com/rclone/rclone/cmd"
"github.com/rclone/rclone/fs/operations"
"github.com/rclone/rclone/fs/sync"
2016-08-05 16:12:27 +00:00
"github.com/spf13/cobra"
)
2019-03-06 08:43:46 +00:00
var (
createEmptySrcDirs = false
)
2016-08-05 16:12:27 +00:00
func init ( ) {
2016-10-22 11:05:45 +00:00
cmd . Root . AddCommand ( commandDefintion )
2019-03-06 08:43:46 +00:00
commandDefintion . Flags ( ) . BoolVarP ( & createEmptySrcDirs , "create-empty-src-dirs" , "" , createEmptySrcDirs , "Create empty source dirs on destination after copy" )
2016-08-05 16:12:27 +00:00
}
2016-10-22 11:05:45 +00:00
var commandDefintion = & cobra . Command {
2016-08-05 16:12:27 +00: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-23 16:34:17 +00:00
If you are familiar with ` + " ` rsync ` " + ` , rclone always works as if you had
2016-08-05 16:12:27 +00: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 09:51:41 +00:00
2018-11-25 16:49:38 +00: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 09:51:41 +00:00
* * Note * * : Use the ` + " ` - P ` " + ` / ` + " ` -- progress ` " + ` flag to view real - time transfer statistics
2016-08-05 16:12:27 +00:00
` ,
Run : func ( command * cobra . Command , args [ ] string ) {
cmd . CheckArgs ( 2 , 2 , command , args )
2018-05-07 17:13:17 +00:00
fsrc , srcFileName , fdst := cmd . NewFsSrcFileDst ( args )
2016-12-04 16:52:24 +00:00
cmd . Run ( true , true , command , func ( ) error {
2018-05-07 17:13:17 +00:00
if srcFileName == "" {
2019-06-17 08:34:30 +00:00
return sync . CopyDir ( context . Background ( ) , fdst , fsrc , createEmptySrcDirs )
2018-05-07 17:13:17 +00:00
}
2019-06-17 08:34:30 +00:00
return operations . CopyFile ( context . Background ( ) , fdst , fsrc , srcFileName , srcFileName )
2016-08-05 16:12:27 +00:00
} )
} ,
}