在R中复制文件夹递归

时间:2015-09-08 08:58:49

标签: r

我在功能中遗漏了什么?
我想将包含一些文件和另一个子文件夹的文件夹从一个位置复制到另一个位置。我尝试使用file.copy(from, to, recursive=TRUE),但它抱怨错误消息:

  

在file.copy中(" my_folder"," new_folder",:

    '递归'将被忽略为' to'不是单个现有目录

结果是一个名为new_folder但没有内容的文件。

有没有办法用R?

复制整个文件夹结构

6 个答案:

答案 0 :(得分:11)

好的,我只知道错误意味着什么... :-)我必须提前创建新目录,现在我可以复制所有内容......

dir.create('new_folder')
file.copy("my_folder", "new_folder", recursive=TRUE)

这可以按预期工作。

答案 1 :(得分:3)

我认为R.utils::copyDirectory(oldDir, newDir)是您所要求的解决方案。也不需要先创建newDir

答案 2 :(得分:3)

如果您想复制位于一个文件夹内的文件,以便它们位于第二个文件夹内,例如

dir1/file1.txt
dir1/nested/file2.txt

到:

dir2/file1.txt
dir2/nested/file2.txt

然后这段代码有效:

from <- "dir1"
to   <- "dir2"
file.copy(list.files(from, full.names = TRUE), 
          to, 
          recursive = TRUE)

避免在 recursive=TRUE 命令中使用 list.files(),否则会丢失嵌套。

file.copy(list.files(from, full.names = TRUE, recursive = TRUE), 
          to, 
          recursive = TRUE)

# incorrect
# dir2/file1.txt
# dir2/file2.txt

上面的其他答案对上述情况没有帮助,例如:

file.copy(from, to, recursive=TRUE)

# incorrect - makes:
# dir2/dir1/file1.txt
# dir2/dir1/nested/file2.txt

file.copy('(...)/path_to_folder_Z', '(...)/folder_X')
# overwrites existing folder if in same parent directory

答案 3 :(得分:1)

我宁愿编写一个R函数,使用终端复制目录。这是我使用的方法,但请注意,到目前为止,我仅针对Linux和OSX编写过它。

dir.copy <- function(from, to) {
  os <- Sys.info()['sysname']
  if (os == "Darwin" || os == "Linux") {
    command <- sprintf("cp -R '%s' '%s'", from, to)
    system(command, intern = TRUE)   
  }
}

快速,轻松,并且像吊饰一样工作。

答案 4 :(得分:0)

这是另一种可能性:

create_Directory <- function(source_Directory = "C:\\dir1",
                             target_Directory = "C:\\dir2")
{
  setwd(source_Directory)
  list_Dirs <- list.dirs()
  setwd(target_Directory)
  bool_Dir_Exists <- dir.exists(list_Dirs)
  dirs_To_Create <- list_Dirs[!bool_Dir_Exists]
  for(dir in dirs_To_Create)
  {
    dir.create(dir)
  }
}

copy_Content_From_One_Directory_To_Another <- function(source_Directory = "C:\\dir1",
                                                       target_Directory = "C:\\dir2")
{
  #### Create the sub directories ####
  create_Directory(source_Directory = source_Directory,
                   target_Directory = target_Directory)

  #### Copy the files ####
  setwd(source_Directory)
  list_Files <- list.files(recursive = TRUE, full.names = TRUE)
  list_Files <- gsub(pattern = "(\\.)/", replacement = "", list_Files)

  file.copy(from = paste0(source_Directory, "/", list_Files),
            to = paste0(target_Directory, "/", list_Files))
}

copy_Content_From_One_Directory_To_Another()


答案 5 :(得分:0)

@matifou在评论中说,发问者本人接受的答案有点令人困惑,因为您最终将复制的文件夹放在同名文件夹中...所以:

您要将Folder_X移到folder_Z。

# create empty folder Z inside folder X
dir.create('(...)/folder_X/folder_Z')
# copy the folder
file.copy('(...)/path_to_folder_Z', '(...)/folder_X')

所以file.copy的第二个参数是 just folder_X,不是 folder_X内新创建的folder_Z。因为文件夹结构看起来像这样:

(...)/ folder_X / folder_Z / folder_Z

(也许这可以为某人节省10分钟左右的时间,但我花了点时间才知道)