将多个子目录中的特定文件复制到 R 中的单个文件夹中
Copying specific files from multiple sub-directories into a single folder in R
假设我有 3 个文件夹,每个文件夹中都有大量文件,我想 select 每个子目录中只有几个文件,然后只将这些文件粘贴到一个新文件夹中。
让我们调用 3 个文件夹:
- desktop/dir/sub_11s_gi01_ab
- desktop/dir/sub_11f_gi01_b
- desktop/dir/sub_12s_gi02_ms
需要复制的文件的扩展名为“.wang.tax.sum”
不能复制所有其他文件然后删除,因为这需要几天时间。
从其他问题来看,我可以将所有文件组合成一个列表并复制所有文件,但我不知道如何只复制以 .wang.tax.sum
结尾的文件
我可以使用 grep 函数获取要传输的文件列表,但不确定如何将子目录中的文件列表复制到新文件夹。
这是我目前所拥有的,但没有用。
parent.folder <- "C:/Desktop/dir"
my_dirs <- list.files(path = parent.folder, full.names = T, recursive = T, include.dirs = T)
##this does not work##
a <- grep("wang.tax.sum",my_dirs)
my_dirs <- my_dirs[a]
files <- sapply(my_dirs, list.files, full.names = T)
dir.create("taxsum", recursive = T)
for(file in files) {
file.copy(file, "taxsum")
}
我知道 grep 在这里不起作用,但我不确定如何创建一个只 select 我想要的文件并将它们复制到一个文件夹的函数。我总共有大约 50 个子文件夹,每个子文件夹都有大约 1gb 的数据,因此再次复制所有数据然后删除我不想要的数据不是一种选择。非常感谢任何帮助
您的 my_dirs
已包含完整文件名,因此无需创建 files
变量。
parent.folder <- "Desktop"
ext <- ".jpg" # Wanted file extension
my_dirs <- list.files(path = parent.folder,
full.names = TRUE, recursive = TRUE, include.dirs = TRUE)
dir.create("Desktop/temp", recursive = TRUE)
n <- sapply(my_dirs[grep(ext, my_dirs)],
FUN=function(x) file.copy(from = x, to = "Desktop/temp/"))
message(paste("Number of files in", parent.folder, "with", ext, ":", length(n),
"(successully copied:", round(sum(n)/length(n)*100, 0), "%)."))
# Number of files in Desktop with .jpg : 4 (successully copied: 100 %).
变量n
将包含一个命名的逻辑向量,您可以在复制文件时遇到任何问题时探索它。
parent.folder <- "C:/Desktop/dir"
files <- list.files(path = parent.folder, full.names = T, recursive = T, include.dirs = T)
之后你需要select相关文件:
files <- files[grep("wang\.tax\.sum", files)]
(注意点之前的两次转义:\.
- 点对 grep 有特殊含义。)
或者您可以一步完成 list.files 的 pattern
参数:
files <- list.files(path = parent.folder, full.names = T, recursive = T, include.dirs = T, pattern = "wang\.tax\.sum")
正在创建新目录:
dir.create("taxsum", recursive = T)
现在您需要创建新的文件名:
newnames <- paste0("taxsum/", gsub("/|:", "_", files))
# replace "special" characters with underscore
# so that your file names will be different and contain the
# original path
# alternatively, if you know that file names will be different:
newnames <- paste0("taxsum/", basename(files))
现在您可以使用 mapply
进行复制(同样可以使用 for
来完成,但需要付出一些额外的努力):
mapply(file.copy, from=files, to=newnames)
假设我有 3 个文件夹,每个文件夹中都有大量文件,我想 select 每个子目录中只有几个文件,然后只将这些文件粘贴到一个新文件夹中。 让我们调用 3 个文件夹:
- desktop/dir/sub_11s_gi01_ab
- desktop/dir/sub_11f_gi01_b
- desktop/dir/sub_12s_gi02_ms
需要复制的文件的扩展名为“.wang.tax.sum”
不能复制所有其他文件然后删除,因为这需要几天时间。
从其他问题来看,我可以将所有文件组合成一个列表并复制所有文件,但我不知道如何只复制以 .wang.tax.sum
结尾的文件
我可以使用 grep 函数获取要传输的文件列表,但不确定如何将子目录中的文件列表复制到新文件夹。
这是我目前所拥有的,但没有用。
parent.folder <- "C:/Desktop/dir"
my_dirs <- list.files(path = parent.folder, full.names = T, recursive = T, include.dirs = T)
##this does not work##
a <- grep("wang.tax.sum",my_dirs)
my_dirs <- my_dirs[a]
files <- sapply(my_dirs, list.files, full.names = T)
dir.create("taxsum", recursive = T)
for(file in files) {
file.copy(file, "taxsum")
}
我知道 grep 在这里不起作用,但我不确定如何创建一个只 select 我想要的文件并将它们复制到一个文件夹的函数。我总共有大约 50 个子文件夹,每个子文件夹都有大约 1gb 的数据,因此再次复制所有数据然后删除我不想要的数据不是一种选择。非常感谢任何帮助
您的 my_dirs
已包含完整文件名,因此无需创建 files
变量。
parent.folder <- "Desktop"
ext <- ".jpg" # Wanted file extension
my_dirs <- list.files(path = parent.folder,
full.names = TRUE, recursive = TRUE, include.dirs = TRUE)
dir.create("Desktop/temp", recursive = TRUE)
n <- sapply(my_dirs[grep(ext, my_dirs)],
FUN=function(x) file.copy(from = x, to = "Desktop/temp/"))
message(paste("Number of files in", parent.folder, "with", ext, ":", length(n),
"(successully copied:", round(sum(n)/length(n)*100, 0), "%)."))
# Number of files in Desktop with .jpg : 4 (successully copied: 100 %).
变量n
将包含一个命名的逻辑向量,您可以在复制文件时遇到任何问题时探索它。
parent.folder <- "C:/Desktop/dir"
files <- list.files(path = parent.folder, full.names = T, recursive = T, include.dirs = T)
之后你需要select相关文件:
files <- files[grep("wang\.tax\.sum", files)]
(注意点之前的两次转义:\.
- 点对 grep 有特殊含义。)
或者您可以一步完成 list.files 的 pattern
参数:
files <- list.files(path = parent.folder, full.names = T, recursive = T, include.dirs = T, pattern = "wang\.tax\.sum")
正在创建新目录:
dir.create("taxsum", recursive = T)
现在您需要创建新的文件名:
newnames <- paste0("taxsum/", gsub("/|:", "_", files))
# replace "special" characters with underscore
# so that your file names will be different and contain the
# original path
# alternatively, if you know that file names will be different:
newnames <- paste0("taxsum/", basename(files))
现在您可以使用 mapply
进行复制(同样可以使用 for
来完成,但需要付出一些额外的努力):
mapply(file.copy, from=files, to=newnames)