Я хочу сжать некоторые файлы в R
с помощью tar()
. Мой код довольно прост:
f <- "C:/TEMP/tarfile.tar.gz"
files_to_compress <- dir(path=tempdir(), full.names = TRUE)
tar(tarfile = f, files = files_to_compress, compression = "gzip")
Сжатие работает, я получаю файл tarfile.tar.gz, но в сжатом файле я также получаю структуру tempdir().
Например, файл tarfile.tar.gz содержит (-> указывает на новый слой папки):
C: -> Пользователи -> MyUserName -> AppData -> Local -> Temp -> RTmpM5Dxmp -> files_to_compress
Как я могу сжать files_to_compress
, не архивируя при этом структуру каталогов?
Отправная точка: передача extra_flags = paste('--cd', shQuote(tempdir()))
должна работать, но по какой-то причине (у меня) нет.
@GKi Вам обязательно нужен full.names
, так как там могут быть подкаталоги. Если вы измените каталог перед перечислением файлов, пути будут правильными. — Тем не менее, вариант без смены рабочего каталога определенно был бы лучше и должен быть возможен.
@Konrad Rudolph: у меня extra_flags тоже не работает. И да, «setwd» для «tempdir()» работает, но я бы предпочел решение без изменения рабочего каталога.
@KonradRudolph: вы предполагаете, что он использует внешний tar
, но по умолчанию он использует внутренний, который не поддерживает эти флаги.
Сначала измените каталог на tempdir()
, затем используйте full.names=FALSE, recursive = TRUE
в dir()
, а затем измените обратно. Например:
f <- "C:/TEMP/tarfile.tar.gz"
savedir <- setwd(tempdir())
files_to_compress <- dir(full.names = FALSE, recursive = TRUE)
tar(tarfile = f, files = files_to_compress, compression = "gzip")
setwd(savedir)
Если бы это было в функции, вы могли бы использовать on.exit()
, чтобы убедиться, что финал setwd()
произойдет.
от setwd
до tempdir()
, чтобы использовать это в качестве отправной точки для папок.
Решение без изменения рабочего каталога возможно с помощью archive::archive_write_dir
(то есть строк old <- setwd(dir)
и on.exit(setwd(old))
).
f <- "C:/TEMP/tarfile.tar.gz"
td <- tempdir() # Create a tempdir
. <- setwd(td) # Save current working directory
cat("x", file = "x.txt") # Create there a file
dir.create("sub") # Create a subfolder in tempdir
cat("y", file = "./sub/y.txt") # and create there a file
tar(tarfile = f, compression = "gzip") # default is to archive all files under the current directory
## Alternatives to the line above:
#files_to_compress <- dir(recursive = TRUE) # Either this where full.names=TRUE would just add ./ what is the curent folder
#files_to_compress <- dir(path=getwd(), full.names = FALSE, recursive = TRUE) # or that with a given path
#
#tar(tarfile = f, files = files_to_compress, compression = "gzip") # and create tar
setwd(.) # Change back to original path
archive::archive_write_dir(f, td) # Create tar using package archive
Может быть, от
setwd
доtempdir()
?