Автоматически удалять файлы/папки

Есть ли способ автоматически удалить все файлы или папки с помощью нескольких командных строк R? Я знаю о функциях unlink() или file.remove(), но для них вам нужно определить вектор символов точно со всеми именами файлов, которые вы хотите удалить. Я больше ищу что-то, что перечисляет все файлы или папки по определенному пути (например, «C:/Temp»), а затем удаляет все файлы с определенным именем (независимо от его расширения).

Любая помощь очень ценится!


person Francesco    schedule 15.02.2012    source источник


Ответы (6)


Может быть, вы просто ищете сочетание file.remove и list.files? Может быть, что-то вроде:

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

И я думаю, вы можете отфильтровать список файлов до тех, чьи имена соответствуют определенному шаблону, используя grep или grepl, нет?

person joran    schedule 15.02.2012
comment
И, возможно, используя аргумент pattern для list.files (или dir, который является синонимом). Я думаю, что они создают вектор по умолчанию, поэтому нужно обернуть их вызовом list, чтобы работать с do.call. - person James; 15.02.2012
comment
Ребята, когда я пытаюсь сделать do.call, как вы сказали, я получаю это сообщение об ошибке: [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE Предупреждающие сообщения: 1: В функции (...): невозможно удалить файл 'Sim2003.dbf' , причина "Нет такого файла или каталога" - person Francesco; 15.02.2012
comment
Из-за чего кажется, что в указанном мной каталоге нет файла (нет файлов)... это довольно странно, поскольку файлы там... и если я просто использую list.files('C:/Temp ') это дает мне все правильные... что я делаю неправильно? - person Francesco; 15.02.2012
comment
Хорошо, я решил это... вам нужно добавить full.names=TRUE внутри функции list.files()... иначе она не найдет их только с относительным путем... - person Francesco; 15.02.2012
comment
Вам не нужно do.call; см. мой ответ. - person Richie Cotton; 15.02.2012

Для всех файлов по известному пути вы можете:

unlink("path/*")
person Hahnemann    schedule 07.10.2015
comment
Почему это не решение с наибольшим количеством голосов? Это прекрасно работает. - person Zediiiii; 24.03.2016
comment
Следует отметить одну вещь: этот метод удаляет все навсегда; файлы не могут быть восстановлены в корзине для мусора. - person Dale Kube; 30.06.2017
comment
Лучшее решение, но иногда не работает. recursive=TRUE и force=TRUE помогают. Я на линуксе. - person Ufos; 17.04.2018
comment
Это отказывается удалять каталог в моих окнах 10 даже с аргументами recursive=TRUE и force=TRUE. Структура каталога - папка/папка/файлы, и я пытаюсь удалить верхнюю папку с помощью unlink(). - person Dan Woodrich; 27.11.2018
comment
Любая альтернатива, которая перемещает файлы в корзину/корзину? - person duncanrager; 18.06.2019

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.

person Richie Cotton    schedule 15.02.2012
comment
Что делать, если я хочу удалить файлы, индекс позиции которых не отображается в векторе индекса позиции? Например, это файлы: a.txt, b.txt, c.txt и мой вектор v ‹- c(1, 3). В результате должны отображаться только файлы: a.txt и c.txt. - person Nanami; 23.07.2013
comment
@Nanami: прочитайте regular-expressions.info/quickstart.html и ?regex. Если вы все же застряли, то задайте вопрос с тегом regex. - person Richie Cotton; 25.07.2013
comment
Спасибо. Я использовал это в своем коде, хотя в итоге я удалил ^ и $ в своем регулярном выражении, и я думаю, что это изменение заставило его работать. Не могу сказать, что проверял это тщательно. - person Leonid; 30.05.2017

Используя комбинацию 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)
person Dason    schedule 15.02.2012
comment
dir принимает аргумент pattern, поэтому вам не нужно отдельно использовать grep. - person Richie Cotton; 15.02.2012
comment
@RichieCotton Хороший вопрос. Я приму это к сведению, так как я не так часто использую dir, и grep показался мне естественным решением. - person Dason; 15.02.2012

Чтобы удалить все внутри папки, но оставить папку пустой

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

Чтобы удалить все внутри папки, а также удалить папку

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

Используйте force = T, чтобы перезаписать любой доступный только для чтения/скрытый/и т.д. вопросы.

person qed    schedule 21.01.2021

Мне очень нравится 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))
person seapen    schedule 11.02.2020