R有一个方便的跨平台tar()函数,可以tar和gzip文件。看来这个函数是为了整个目录而设计的。我希望使用此函数来tar和压缩目录的子集或单个文件。但是,我似乎无法做到这一点。我期待以下内容在当前工作目录中查找单个csv文件:
tar( "tst.tgz", "myCsv.csv", compression="gzip" )
所以只能在目录上使用tar()函数吗?
我暂时通过创建一个临时目录,复制我的文件,然后使用整个临时目录来解决这个问题。但我希望有一个更简单的解决方案。这不需要复制文件,这对于大文件来说有些耗时。
答案 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:默认值 是存档当前目录下的所有文件。