6

/tmp/RtmpK4k1Ju/oldname将整个目录从 say 移动到的最可靠的方法是什么/home/jeroen/newname?然而,最简单的方法file.rename并不总是有效,例如当fromto在不同的磁盘上时。在这种情况下,需要递归复制整个目录。

这是我想出的东西,但是它有点复杂,我不确定它是否可以跨平台工作。有没有更好的办法?

dir.move <- function(from, to){
  stopifnot(!file.exists(to));
  if(file.rename(from, to)){
    return(TRUE)
  }
  stopifnot(dir.create(to, recursive=TRUE));
  setwd(from)
  if(all(file.copy(list.files(all.files=TRUE, include.dirs=TRUE), to, recursive=TRUE))){
    #success!
    unlink(from, recursive=TRUE);
    return(TRUE)
  }
  #fail!
  unlink(to, recursive=TRUE);
  stop("Failed to move ", from, " to ", to);
}
4

2 回答 2

3

我认为file.copy应该足够了。

file.copy(from, to, overwrite = recursive, recursive = FALSE,
          copy.mode = TRUE)

来自?file.copy

from, to: character vectors, containing file names or paths.  For
         ‘file.copy’ and ‘file.symlink’ ‘to’ can alternatively
         be the path to a single existing directory.

和:

recursive: logical.  If ‘to’ is a directory, should directories in
          ‘from’ be copied (and their contents)?  (Like ‘cp -R’ on
          POSIX OSes.)

从关于我们的描述中recursive我们知道from可以有目录。因此,在您上面的代码中,在复制之前列出所有文件是不必要的。只需记住该to目录将是复制的from. 例如, after file.copy("dir_a/", "new_dir/", recursive = T),会有一个dir_aunder new_dir

您的代码已经很好地完成了删除部分。unlink有一个不错的recursive选择,file.remove但没有。

unlink(x, recursive = FALSE, force = FALSE)
于 2013-07-30T18:41:05.257 回答
0

为什么不直接调用系统:

> system('mv /tmp/RtmpK4k1Ju/oldname /home/jeroen/newname')  
于 2013-07-27T11:29:36.920 回答