【问题标题】:R: Deleting Files in R based on their NamesR:根据文件名删除 R 中的文件
【发布时间】:2022-01-23 18:20:09
【问题描述】:

我正在使用 R 编程语言。

我发现了以下相关问题 Stackoverflow (how to delete a file with R?),它向您展示了如何从工作目录中删除具有特定名称的文件:

#Define the file name that will be deleted
fn <- "foo.txt"

#Check its existence
if (file.exists(fn)) {
    #Delete file if it exists
    file.remove(fn)
}

[1] TRUE

我的问题:是否可以根据文件名是否包含特定的字母组合(即LIKE 'fo%')来删除文件?这样,工作目录中所有以“fo”开头的文件都会被删除。

到目前为止我尝试了什么:

我想到了一种方法,首先我可以根据它们的名称创建工作目录中我想要删除的所有文件的列表:

# create list of all files in working directory 
a = getwd()
path.to.csv <- a
files<-list.files(path.to.csv)
my_list = print(files)  ## list all files in path

#identify files that match the condition
to_be_deleted = my_list[grepl("fo",unlist(my_list))]

然后,我尝试使用之前使用的命令删除此文件:

if (file.exists(to_be_deleted)) {
    #Delete file if it exists
    file.remove(to_be_deleted)
}

这返回了以下消息:

[1] TRUE TRUE TRUE TRUE TRUE TRUE
Warning message:
In if (file.exists(to_be_deleted)) { :
  the condition has length > 1 and only the first element will be used

有人知道我这样做是否正确吗?假设如果工作目录中有多个文件,这些文件的名称以“fo”开头 - 所有这些文件是否都已被删除?还是仅此列表中的第一个文件?

有人可以告诉我如何正确执行此操作吗?

谢谢!

【问题讨论】:

    标签: r delete-file


    【解决方案1】:

    file.remove 接受要删除的文件列表。

    关于file.exists,它也接受一个列表,但它会返回一个逻辑值列表,每个文件一个。这不适用于 if,它只需要 一个 逻辑值。 但是,您无需检查从list.files 获得的文件是否存在:它们显然存在。

    所以,最简单的方法是删除if 测试并调用file.remove

    files <- list.files(path, pattern = "fo")
    to_be_deleted <- grep("fo", files, value = T)
    file.remove(to_be_deleted)
    

    甚至更简单:

    to_be_deleted <- list.files(path, pattern = "fo")
    file.remove(to_be_deleted)
    

    不过有几点注意事项:

    • 这里你事先不知道你是否有权删除这些 文件。
    • 您不知道名称是否确实是文件,或者 目录(或其他)。很容易相信 file.exists回答第二个问题,也就是它可能会告诉你 一个名字是一个真实的文件,但实际上它不是: file.exists(path) 在 path 是目录时也返回 TRUE。 但是,您可以使用dir.exists(path) 检测目录。取决于 根据您的具体情况,可能需要也可能不需要检查 这个(例如,如果你知道传递给 grep 的模式总是 过滤文件,没关系)。

    【讨论】:

    • @Jean-Claude Arbaut:非常感谢您的回答!如果你有时间,你能告诉我这会是什么样子的完整形式吗?非常感谢!
    • @stats555 完成。简化了一点:grep 可以返回文件名列表,因此您不必从向量中获取逻辑值和子集。
    • list.files 有一个采用正则表达式的模式参数;您不需要单独的grep 步骤
    • @camille 好点。我相应地修改了答案。
    猜你喜欢
    • 2020-02-10
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多