2017-09-20 3 views
1

Ich habe ein Verzeichnis mit vielen Unterverzeichnissen. Ich verwende list.dirs in Kombination mit list.files, um Verzeichnisse zu finden, die eine bestimmte Datei enthalten. Sobald die Datei gefunden ist, möchte ich das Unterverzeichnis aus der Liste list.dirs entfernen, damit ich in den verbleibenden Verzeichnissen nach verschiedenen Dateien suchen kann. Die Idee ist, dass der Code alle Verzeichnisse durchsucht, die nach einer Datei suchen, die dem Muster entspricht, das ich in list.files angegeben habe, und dabei die Verzeichnisse, in denen die Datei gefunden wurde, aus der Verzeichnisliste list.dirs entfernt. Hier ist ein Beispiel-Verzeichnis Setup:Verzeichnis aus list.dirs entfernen/filtern, wenn Datei existiert, r

subdir1 
    filea.txt 
subdir2 
    fileb.txt 
subdir3 
    filea.txt 

ich für die Existenz einer Datei eine If-Anweisung versucht zu schreiben, um dann das aktuelle Unterverzeichnis aus der Liste der Verzeichnisse zu entfernen, aber war erfolglos:

subDirsPaths = list.dirs(path=".", full.names=TRUE) 

for (subDirsPath in subDirsPaths){ 
    setwd("/home/phil/Desktop/folder") 

    inFilePaths = list.files(path=".", pattern=glob2rx(print(paste("*","a.txt", sep=""))), full.names=TRUE) 
    for (inFilePath in inFilePaths){ 

     inFilePath2 <- gsub("./", "", inFilePath) 
     if (file.exists(print(paste(inFilePath2, sep="")))) 
     { 

     print("file exists") 
     subDirsPaths <- subDirsPaths[-subDirsPath] 
     } else {} 

    } 


    } 

Danach lief ist, möchte ich auf die Verzeichnisse nur ein weiteres

for(subDirsPath in subDirsPaths) {} 

Aber dieses Mal ausführen, die nicht auf die Dateien enthalten habe ich wurde in dem vorherigen Codeblock suchen, einem so weiter.

Wenn ich subDirsPaths in das Terminal eingeben es auflistet:

subDirsPaths 

"./subdir1" "./subdir2" "./subdir3" 

Was ich will, nachdem ich diesen Code ausführen, ist dies:

subDirsPaths 

"./subdir2" 

Wie Sie sehen können, da DateiA.txt gefunden wurde In Unterverzeichnis1 und Unterverzeichnis3 wurden sie aus der Liste der Verzeichnisse entfernt.

+0

Würde der 'recurse' Option in' list.files' in Kombination mit der 'full.names = TRUE' Option einfacher? –

+0

Nein, weil ich in meinem tatsächlichen Verzeichnis zusätzliche Unterverzeichnisse innerhalb dieser Unterverzeichnisse habe, die die Rekursivoption komplizieren. –

+0

nicht sicher, ob ich verstehe, was Sie wollen, aber suchen Sie nicht nach 'basename'? –

Antwort

0

Ich habe das herausgefunden. Das Problem ist, wie ich versuchte, das Verzeichnis aus der Liste der Verzeichnisse zu entfernen. Das aktuelle Verzeichnis wird als subDirsPath aufgelistet, das ich aus meiner Liste der Verzeichnisse namens subDirsPaths zu entfernen versuche.

ich zunächst versucht dies mit dieser Anweisung zu erreichen:

subDirsPaths <- subDirsPaths[-subDirsPath] 

ich diese Zeile mit der folgenden Lösung ersetzt:

subDirsPaths <- subDirsPaths[!subDirsPaths %in% grep(paste0(subDirsPath, collapse = "|"), subDirsPaths, value = T)] 
Verwandte Themen