Skip to content

Copies an existing Drive file into a new file id.


  path = NULL,
  name = NULL,
  overwrite = NA,
  verbose = deprecated()



Something that identifies the file of interest on your Google Drive. Can be a name or path, a file id or URL marked with as_id(), or a dribble.


Specifies target destination for the new file on Google Drive. Can be an actual path (character), a file id marked with as_id(), or a dribble.

If path is a shortcut to a folder, it is automatically resolved to its target folder.

If path is given as a path (as opposed to a dribble or an id), it is best to explicitly indicate if it's a folder by including a trailing slash, since it cannot always be worked out from the context of the call. By default, the new file has the same parent folder as the source file.


Character, new file name if not specified as part of path. This will force path to be interpreted as a folder, even if it is character and lacks a trailing slash. Defaults to "Copy of FILE-NAME".


Named parameters to pass along to the Drive API. Has dynamic dots semantics. You can affect the metadata of the target file by specifying properties of the Files resource via .... Read the "Request body" section of the Drive API docs for the associated endpoint to learn about relevant parameters.


Logical, indicating whether to check for a pre-existing file at the targetted "filepath". The quotes around "filepath" refer to the fact that Drive does not impose a 1-to-1 relationship between filepaths and files, like a typical file system; read more about that in drive_get().

  • NA (default): Just do the operation, even if it results in multiple files with the same filepath.

  • TRUE: Check for a pre-existing file at the filepath. If there is zero or one, move a pre-existing file to the trash, then carry on. Note that the new file does not inherit any properties from the old one, such as sharing or publishing settings. It will have a new file ID. An error is thrown if two or more pre-existing files are found.

  • FALSE: Error if there is any pre-existing file at the filepath.

Note that existence checks, based on filepath, are expensive operations, i.e. they require additional API calls.


[Deprecated] This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use options(googledrive_quiet = TRUE) (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers local_drive_quiet() or with_drive_quiet().


An object of class dribble, a tibble with one row per file.


# Target one of the official example files
(src_file <- drive_example_remote("chicken.txt"))
#> # A dribble: 1 × 3
#>   name        id                                drive_resource   
#>   <chr>       <drv_id>                          <list>           
#> 1 chicken.txt 1wOLeWVRkTb6lDmLRiOhg9iKM7DlN762Y <named list [38]>

# Make a "Copy of" copy in your My Drive
cp1 <- drive_cp(src_file)
#> Original file:
#>chicken.txt <id: 1wOLeWVRkTb6lDmLRiOhg9iKM7DlN762Y>
#> Copied to file:
#>Copy of chicken.txt <id: 13C0IFBlHKUr-Ch07Vxwr9RzKnDfjcd4X>

# Make an explicitly named copy, in a different folder, and star it.
# The starring is an example of providing metadata via `...`.
# `starred` is not an actual argument to `drive_cp()`,
# it just gets passed through to the API.
folder <- drive_mkdir("drive-cp-folder")
#> Created Drive file:
#>drive-cp-folder <id: 13e7tYB6Sxqt-BBLwNH7q97gLZAVNaWLN>
#> With MIME type:
cp2 <- drive_cp(
  path = folder,
  name = "chicken-cp.txt",
  starred = TRUE
#> Original file:
#>chicken.txt <id: 1wOLeWVRkTb6lDmLRiOhg9iKM7DlN762Y>
#> Copied to file:
#>drive-cp-folder/chicken-cp.txt <id: 1f1emvuybwQhIBgfMEdvbNWsjvOVzpdN3>
drive_reveal(cp2, "starred")
#> # A dribble: 1 × 4
#>   name           starred id                                drive_resource
#>   <chr>          <lgl>   <drv_id>                          <list>        
#> 1 chicken-cp.txt TRUE    1f1emvuybwQhIBgfMEdvbNWsjvOVzpdN3 <named list>  

# `overwrite = FALSE` errors if file already exists at target filepath
# drive_cp(src_file, name = "Copy of chicken.txt", overwrite = FALSE)

# `overwrite = TRUE` moves an existing file to trash, then proceeds
cp3 <- drive_cp(src_file, name = "Copy of chicken.txt", overwrite = TRUE)
#> File trashed:
#>Copy of chicken.txt <id: 13C0IFBlHKUr-Ch07Vxwr9RzKnDfjcd4X>
#> Original file:
#>chicken.txt <id: 1wOLeWVRkTb6lDmLRiOhg9iKM7DlN762Y>
#> Copied to file:
#>Copy of chicken.txt <id: 11QbIifQr9rpUFA8hPlB8jIQoECmRawVA>

# Delete all of our copies and the new folder!
drive_rm(cp1, cp2, cp3, folder)
#> Files deleted:
#>Copy of chicken.txt <id: 13C0IFBlHKUr-Ch07Vxwr9RzKnDfjcd4X>
#>chicken-cp.txt <id: 1f1emvuybwQhIBgfMEdvbNWsjvOVzpdN3>
#>Copy of chicken.txt <id: 11QbIifQr9rpUFA8hPlB8jIQoECmRawVA>
#>drive-cp-folder <id: 13e7tYB6Sxqt-BBLwNH7q97gLZAVNaWLN>

# Target an official example file that's a csv file
(csv_file <- drive_example_remote("chicken.csv"))
#> # A dribble: 1 × 3
#>   name        id                                drive_resource   
#>   <chr>       <drv_id>                          <list>           
#> 1 chicken.csv 1VOh6wWbRfuQLxbLg87o58vxJt95SIiZ7 <named list [37]>

# copy AND AT THE SAME TIME convert it to a Google Sheet
chicken_sheet <- drive_cp(
  name = "chicken-sheet-copy",
  mime_type = drive_mime_type("spreadsheet")
#> Original file:
#>chicken.csv <id: 1VOh6wWbRfuQLxbLg87o58vxJt95SIiZ7>
#> Copied to file:
#>chicken-sheet-copy <id: 1-CFVX3pNimDq1Wsu4tLZfaEQXFQZATbM9rnE9oSCWQs>
# is it really a Google Sheet?
drive_reveal(chicken_sheet, "mime_type")$mime_type
#> [1] "application/"

# go see the new Sheet in the browser
# drive_browse(chicken_sheet)

# Clean up
#> File deleted:
#>chicken-sheet-copy <id: 1-CFVX3pNimDq1Wsu4tLZfaEQXFQZATbM9rnE9oSCWQs>