自动删除文件/文件夹

77

有没有办法用少量R命令自动删除所有文件或文件夹? 我知道unlink()file.remove()函数,但是对于这些函数,您需要定义一个字符向量,并且确切地列出要删除的所有文件的名称。我更希望能够列出特定路径(例如'C:/Temp')中的所有文件或文件夹,然后删除所有具有特定名称的文件(无论其扩展名如何)。

非常感谢任何帮助!

6个回答

85

对于已知路径下的所有文件,您可以:

unlink("path/*")

13
为什么这不是得票最高的解决方案?这个方法非常有效。 - Zediiiii
5
需要注意的一点是:该方法会永久删除所有内容;无法在回收站中恢复文件。 - Dale Kube
2
最佳解决方案,但有时不起作用。recursive=TRUEforce=TRUE会有所帮助。 我在Linux上。 - Ufos
即使使用recursive=TRUE和force=TRUE参数,这仍然无法在我的Windows 10中删除一个目录。该目录的结构是folder/folder/files,我正在尝试使用unlink()删除顶层文件夹。 - Dan Woodrich
有没有其他方法可以将文件移动到回收站/垃圾桶? - duncanrager

84

也许您只是在寻找 file.removelist.files 的组合?或许可以尝试如下代码:

do.call(file.remove, list(list.files("C:/Temp", full.names = TRUE)))

我猜你可以使用grepgrepl过滤文件列表,只保留那些文件名符合特定模式的文件,对吗?


4
可能需要使用list.filespattern参数(或其同义词dir),默认情况下它们会产生一个向量,因此需要将list函数用于do.call的操作。请注意,翻译保持原意,不包含任何解释性内容。 - James
1
伙计们,当我尝试像你们说的那样使用do.call时,我得到了这个错误信息:[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 警告信息: 1:在函数中(...): 无法删除文件'Sim2003.dbf',原因是'没有这个文件或目录'。 - Francesco
这让人觉得好像在我指定的目录中没有文件(没有任何文件)...这有点奇怪,因为文件确实存在...如果我只是使用list.files('C:/Temp'),它会给我所有正确的文件...我做错了什么? - Francesco
7
好的,我解决了...你需要在list.files()函数中添加full.names=TRUE参数...否则它无法仅通过相对路径找到它们... - Francesco
1
你不需要使用 do.call;请看我的回答。 - Richie Cotton

29
dir_to_clean <- tempdir() #or wherever

#create some junk to test it with
file.create(file.path(
  dir_to_clean, 
  paste("test", 1:5, "txt", sep = ".")
))

#Now remove them (no need for messing about with do.call)
file.remove(dir(  
  dir_to_clean, 
  pattern = "^test\\.[0-9]\\.txt$", 
  full.names = TRUE
))

你也可以使用unlink作为file.remove的替代方案。


如果我想删除那些在位置索引向量中没有显示的文件怎么办?例如,这些文件是:a.txt、b.txt、c.txt,而我的向量v <- c(1, 3)。结果应该只显示文件a.txt和c.txt。 - Nanami
@Nanami:阅读http://www.regular-expressions.info/quickstart.html和`?regex`。如果你仍然卡住了,那么请使用标签`regex`提出问题。 - Richie Cotton
谢谢。虽然我最终删除了正则表达式中的“^”和“$”,但我还是在我的代码中使用了它,我认为这是使它正常工作的变化。不能说我彻底测试过它。 - Leonid
这是一个很好的解决方案。只需指定目录即可(为像我这样不那么熟练的R用户提供启示)。“file.remove(dir(path = "01 Data/", pattern = "my_pattern", full.names = TRUE))” - glenn_in_boston

6

删除文件夹中的所有内容,但保留空文件夹。

unlink("path/*", recursive = T, force = T)

删除文件夹内所有内容,同时删除文件夹本身。
unlink("path", recursive = T, force = T)

使用force = T,覆盖任何只读/隐藏等问题。


4
使用dir和grep的组合并不太困难。这可能可以转换成一个函数,该函数还会告诉您要删除哪些文件,并在它不是您期望的内容时给您中止的机会。
# Which directory?
mydir <- "C:/Test"
# What phrase do you want contained in
# the files to be deleted?
deletephrase <- "deleteme"

# Look at directory
dir(mydir)
# Figure out which files should be deleted
id <- grep(deletephrase, dir(mydir))
# Get the full path of the files to be deleted
todelete <- dir(mydir, full.names = TRUE)[id]
# BALEETED
unlink(todelete)

dir 命令接受一个 pattern 参数,因此您无需单独使用 grep 命令。 - Richie Cotton
@RichieCotton 很好的观点。我会记下来的,因为我并不经常使用dir,而grep似乎是一个自然的解决方案。 - Dason

0

我非常喜欢使用here::here来浏览文件夹(特别是当我在Rmarkdown笔记本的内联评估和编织版本之间切换时)...这是另一种解决方案:

    # Batch remove files
    # Match files in chosen directory with specified regex
    files <- dir(here::here("your_folder"), "your_pattern") 

    # Remove matched files
    unlink(paste0(here::here("your_folder"), files))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接