【问题标题】:remove/filter directory from list.dirs if file exists, r如果文件存在,则从 list.dirs 中删除/过滤目录,r
【发布时间】:2017-09-20 06:56:36
【问题描述】:

我有一个包含很多子目录的目录。我将 list.dirs 与 list.files 结合使用来查找包含特定文件的目录。找到文件后,我想从 list.dirs 列表中删除子目录,以便在剩余目录中查找不同的文件。这个想法是让代码通过所有目录寻找符合我在 list.files 中指出的模式的文件,同时从 list.dirs 目录列表中删除找到该文件的目录。这是一个示例目录设置:

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

我尝试为文件的存在编写一个 If 语句,然后从目录列表中删除当前子目录,但没有成功:

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 {}

    }


  }

这个跑完之后,我想再跑一个

for(subDirsPath in subDirsPaths) {}

但这一次只在不包含我在上一个代码块中寻找的文件的目录上,依此类推。

当我在终端中输入 subDirsPaths 时,它会列出:

subDirsPaths

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

运行这段代码后我想要的是:

subDirsPaths

"./subdir2"

如您所见,由于在 subdir1 和 subdir3 中找到了 filea.txt,因此它们已从目录列表中删除。

【问题讨论】:

  • list.files 中的recurse 选项与full.names = TRUE 选项结合使用会更简单吗?
  • 否,因为在我的实际目录中,我在这些子目录中有额外的子目录,使递归选项复杂化。
  • 不确定我是否明白你想要什么但你不是在寻找basename吗?
  • 我尝试了 basename 但找到了对象。 list.dirs 包含列表中基本名称之前的 ./。我会将所需的输出添加到问题中以进行澄清。

标签: r


【解决方案1】:

我想通了。问题是我如何尝试从目录列表中删除目录。当前目录被列为 subDirsPath,我试图从名为 subDirsPaths 的目录列表中删除它。

我最初尝试使用以下语句来完成此操作:

subDirsPaths <- subDirsPaths[-subDirsPath]

我用以下解决方案替换了这一行:

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

【讨论】:

    猜你喜欢
    • 2016-01-23
    • 1970-01-01
    • 2012-04-19
    • 2013-04-16
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2015-07-13
    • 2016-03-01
    相关资源
    最近更新 更多