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