在特定文件上使用R的内部tar函数

时间:2011-01-23 16:07:02

标签: r tar

R有一个方便的跨平台tar()函数,可以tar和gzip文件。看来这个函数是为了整个目录而设计的。我希望使用此函数来tar和压缩目录的子集或单个文件。但是,我似乎无法做到这一点。我期待以下内容在当前工作目录中查找单个csv文件:

tar( "tst.tgz", "myCsv.csv", compression="gzip" )

所以只能在目录上使用tar()函数吗?

我暂时通过创建一个临时目录,复制我的文件,然后使用整个临时目录来解决这个问题。但我希望有一个更简单的解决方案。这不需要复制文件,这对于大文件来说有些耗时。

3 个答案:

答案 0 :(得分:10)

我不认为这是可能的,因为你描述JD。 files参数传递给path的{​​{1}}参数,因此它的工作原理是编写目录中的文件,而不是单个文件。

如果您准备编辑内部功能,可以通过调用list.files内的tar()来调用list.files()来完成您想要的操作。有点小问题产生了下面的tar()函数,它有额外的参数来控制tar2()返回的内容。使用此功能,我们可以通过以下呼叫实现您想要的功能:

list.files()

tar2("foo.tar", path = ".", pattern = "bar.csv", recursive = FALSE, full.names = FALSE, all.files = FALSE) 可能是多余的,除非您隐藏的文件名称包含all.files = FALSE

"bar.csv"位只会阻止功能搜索除了当前目录以外的任何地方,如果工作目录有很多文件和子文件夹,这似乎是你想要的并加快搜索速度。

recursive = FALSE位是关键。如果这是full.names = FALSE,则TRUE将匹配的文件名作为list.files()返回,"./bar.csv"将保留在tarball内的文件夹中。如果我们将其设置为tar(),则FALSE会返回list.files(),因此我们会根据请求获得包含单个CSV文件的tarball。

如果您的文件具有相似的名称并且只希望找到所声明的文件名,请使用"bar.csv"^将其固定在模式中,例如:

$

以下是修改后的tar2("foo.tar", path = ".", pattern = "^bar.csv$", recursive = FALSE, full.names = FALSE, all.files = FALSE) 函数tar()

tar2()

答案 1 :(得分:3)

这已经进一步修订,进一步简化了tar1代码。此外,tar1现在可以输出一个没有目录的文件或没有目录的多个文件。基本上我们需要解决在tar中使用list.files R的错误,我们通过重新定义list.files使用的tar1来做到这一点。

操纵tar环境的行实际上会创建tar的副本,其环境是tar1内的环境,以便在复制tar时首先运行它在那里看list.files。如果我们没有使用新环境制作tar的副本,那么它将使用R基础中的list.files,忽略我们的重新定义。

tar1下面是tar命令的变体,它生成一个tar文件,其组件具有一个级别(即一个文件或一组没有目录的文件)。假设所有文件都在当前目录中。

根据tar1的定义,我们通过创建两个文件并使用第一个文件创建存档,然后使用这两个文件来测试它。

# tar a single file
tar1 <- function(...) {
    list.files <- function(...) ..1
    environment(tar) <- environment()
    tar(...)
}

# test - first create test files, then some test runs of tar1
cat("a", file = "a.csv")
cat("b", file = "a.csv")

tar1("tst.tgz", "a.csv", "gzip")
tar1("tst2.tgz", Sys.glob("*.csv"), "gzip")

答案 2 :(得分:1)

如果你给files=要求的字符向量,比如用合适的模式运行list.files()(或其同义词dir()),会发生什么?在那里可以清楚地看到帮助:

  

参数:

     

tarfile:tarfile的路径名:代码扩展(参见             'path.expand')将被执行。或者,a             可用于二进制写入的连接。

     

文件:要存档的字符向量offilepath:默认值             是存档当前目录下的所有文件。