2012-02-15 12 views
34

¿Hay alguna manera de eliminar automáticamente todos los archivos o carpetas con pocas líneas de comando R? Conozco las funciones unlink() o file.remove(), pero para aquellas necesita definir un vector de caracteres con exactamente todos los nombres de los archivos que desea eliminar. Estoy buscando algo que enumere todos los archivos o carpetas dentro de una ruta específica (por ejemplo, 'C:/Temp') y luego elimine todos los archivos con un nombre determinado (independientemente de su extensión).Eliminar automáticamente archivos/carpetas en R

¡Toda ayuda es muy apreciada!

Respuesta

39

¿Quizás solo está buscando una combinación de file.remove y list.files? Tal vez algo como:

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

Y supongo que se puede filtrar la lista de archivos a aquellos cuyos nombres coincidan con un patrón determinado usando grep o grepl, ¿no?

+2

y posiblemente usando el argumento 'pattern' a 'list.files' (o' dir' que es un sinónimo). Creo que producen un vector de forma predeterminada, por lo que deben envolver una llamada 'list' para trabajar con' do.call'. – James

+1

Chicos, cuando pruebo el do.call como dijiste obtengo este mensaje de error: [1] FALSO FALSO FALSO FALSO FALSO FALSO FALSO FALSO Mensajes de advertencia: 1: En función (...): no se puede eliminar el archivo ' Sim2003.dbf ', razone' No existe ese archivo o directorio ' – Francesco

+0

Lo que hace que parezca que no hay ningún archivo (no hay archivos) en el directorio que especifico ... eso es un poco raro ya que los archivos están ahí ... y si solo uso list.files ('C:/Temp') me da todos los correctos ... ¿qué estoy haciendo mal? – Francesco

3

Usando una combinación de dir y grep esto no es tan malo. Esto probablemente podría convertirse en una función que también le diga qué archivos se deben eliminar y le da la oportunidad de abortar si no es lo que esperaba.

# 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) 
+0

'dir' toma un argumento' pattern', por lo que no necesita el uso separado de 'grep'. –

+0

@RichieCotton Buen punto. Tomaré nota de eso ya que realmente no uso dir todo el tiempo y grep me pareció una solución natural. – Dason

17
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 
)) 

También puede utilizar unlink como una alternativa a file.remove.

+0

+1 ¡Bien hecho! – joran

+0

¿Qué sucede si quiero eliminar archivos cuyo indice de posición no se muestra en un vector de índice de posición? Por ejemplo, los archivos son: a.txt, b.txt, c.txt y mi vector v <- c (1, 3). El resultado solo debería mostrar archivos: a.txt y c.txt – Nanami

+0

@Nanami: lea http://www.regular-expressions.info/quickstart.html y '? Regex'. Si todavía está atascado, haga una pregunta con la etiqueta 'regex'. –

15

Para todos los archivos en un camino conocido puede:

unlink("path/*") 
+7

¿Por qué esta no es la solución más votado? Esto funciona maravillosamente. – Zediiiii

+1

Una cosa a tener en cuenta: este método elimina todo para siempre; los archivos no se pueden recuperar dentro de la papelera de reciclaje. –

0

Para eliminar archivos de una extensión en particular, link Esto también puede ser seguido,

junk <- dir(path="your_path", pattern="your_pattern") 
file.remove(junk) 
Cuestiones relacionadas