使用R语言复制文件

35
作为在 Windows 下运行的 R 中执行的更大任务的一部分,我希望在目录之间复制选定的文件。是否可能在 R 中给出像 cp patha/filea*.csv pathb 这样的命令(请注意通配符,以增加乐趣)?
2个回答

54

我认为没有直接的方法(除非使用shell),但以下类似的方法通常对我有用。

flist <- list.files("patha", "^filea.+[.]csv$", full.names = TRUE)
file.copy(flist, "pathb")

注意:

  • 我特意将操作分为两个步骤,它们可以合并。
  • 请查看正则表达式:R使用真正的正则表达式,并将文件模式与路径分开为两个独立参数。
  • 请注意正则表达式中的^$(字符串的开头和结尾)——这是一个常见的错误,因为在通配符类型的模式中,这些内容是隐含的,但是在正则表达式中是必需的(以防选择一些文件名与通配符模式匹配,但同时以其他文本开头和/或结尾)。
  • 在Windows世界中,人们通常会向list.files添加ignore.case = TRUE参数,以模拟此操作系统中目录搜索不区分大小写的事实。
  • R的glob2rx()函数提供了一种将通配符模式转换为正则表达式的便捷方法。例如fpattern = glob2rx('filea*.csv')返回一个不同但等效的正则表达式。

1
我认为模式应该是"^filea.+[.]csv" - Marek
@Marek:你说得对!特别是在Windows世界中,人们通常会想要添加参数ignore.case = TRUE。我已经相应地进行了编辑,谢谢。 - mjv
你可以使用?glob2rx将通配符转换为正则表达式。 - Eduardo Leoni
@Edurardo Leoni:是的,你可以。关于R语言的好处之一是,你不断发现做事情的新方法,虽然有时会让人感到不安。这是我第一次听说在R中使用glob2rx;通常我会手写我的正则表达式(顺便说一下,对于globbing模式来说并不难),但是,是的,glob2rx()也可以工作。我将把这个内容添加到答案的注释中。 - mjv
2
如果您使用此功能来复制和替换文件,请不要忘记file.copy()中添加overwrite = TRUE!我因此浪费了一个小时进行调试。 - micstr

12

你可以:

  • 使用system()来执行一个命令,就像在shell中一样,包括globbing(文件名扩展)。
  • 使用list.files()或者别名dir()手动进行globbing(文件名扩展)和正则表达式匹配,然后逐个复制文件。
  • 按照mjv的回答所示,对单个文件使用file.copy

1
从来没有听说过 dir。它与 list.files 完全相同...奇怪同时存在两个。 - MichaelChirico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接