R:获取文件列表但不获取目录列表

时间:2014-02-27 12:52:05

标签: r list file

在R中如何获取文件夹中的文件列表,而不是目录中的文件列表?

我尝试使用不同选项的dir()list.files()list.dirs(), 但它们似乎都不起作用。

6 个答案:

答案 0 :(得分:18)

setdiff(list.files(), list.dirs(recursive = FALSE, full.names = FALSE))

会做到这一点。

答案 1 :(得分:8)

这是一种可能性:

all.files <- list.files(rec=F)
all.files[!file.info(all.files)$isdir]

另一种选择(具有扩展名的文件的模式,当然不是那么普遍):

Sys.glob("*.*")

答案 2 :(得分:2)

另一种选择:

Filter(function(x) file_test("-f", x), list.files())

如果您希望使用库functional完全正常运行,那么您可以节省一些按键:

Filter(Curry(file_test, "-f"), list.files())

后者将file_test转换为第一个参数设置为“-f”的函数,这基本上就是我们在第一种方法中所做的,但是Curry更干净,因为它让function关键字过长的可悲决定(为什么不f(x) {...} ???)

答案 3 :(得分:1)

所以,我知道这些都是陈旧的,并且有一个接受的答案,但我尝试了大部分,但没有一个真的有效。

这是我得到的:

  1. 文件夹中所有文件的示例:

    files <- list.files("Training/Out/")
    
  2. 该代码的输出:

    [1] "Filtered"           "Training_Chr01.txt" "Training_Chr02.txt" "Training_Chr03.txt"
    [5] "Training_Chr04.txt" "Training_Chr05.txt" "Training_Chr06.txt" "Training_Chr07.txt"
    [9] "Training_Chr08.txt" "Training_Chr09.txt" "Training_Chr10.txt"
    
  3. 第一个[1]是目录

    1. 将此代码保留为仅获取文件:

      files <- list.files("Training/Out",recursive = TRUE)
      
    2. 使用此输出:

      [1] "Training_Chr01.txt" "Training_Chr02.txt" "Training_Chr03.txt" "Training_Chr04.txt"
      [5] "Training_Chr05.txt" "Training_Chr06.txt" "Training_Chr07.txt" "Training_Chr08.txt"
      [9] "Training_Chr09.txt" "Training_Chr10.txt"
      
    3. 这或多或少可以帮助那些看着这个并且和我一样困惑的人。

答案 4 :(得分:0)

基R没有直接的方法来执行此操作的事实令人震惊。 BASH没有直接方法的事实也有点奇怪。

我认为,最好的R解决方案是简单地吸引shell:

Object.assign({}, state, { jwt: action.jwt });

说明:

filenames = system('ls -p | grep -v /', intern=T)

答案 5 :(得分:0)

我写了一个小包装函数来解决这个问题:

list_files <- function(path = ".", pattern = NULL, all.files = FALSE, full.names = TRUE, 
                       recursive = FALSE, ignore.case = FALSE, include.dirs = FALSE, no.. = FALSE, 
                       incl_dirs = FALSE){
  
  #Set incl_dirs = TRUE to revert to default list.files() behavior.

  if(path == ".") { path = getwd() }
  
  #Include directories if recursive is set.
  if(incl_dirs & recursive) { include.dirs = TRUE }
  
  #Needs to have full.names = TRUE in order to get full path to pass to dir.exists().
  files <- list.files(path = path, pattern = pattern, all.files = all.files, full.names = TRUE, 
                      recursive = recursive, ignore.case = ignore.case, include.dirs = include.dirs, 
                      no.. = no..)
  
  if(!incl_dirs){
    files <- files[!dir.exists(files)]
  }
  
  if(!full.names){
    return(basename(files))
  } else{
    return(files)
  }
  
}

使用以下示例目录结构:

dir_test_lvl0/
├── dir_test_lvl1
│   ├── dir_test_lvl2
│   │   ├── dir_test_lvl3
│   │   │   ├── dir_test_lvl4
│   │   │   └── file_test_lvl4
│   │   └── file_test_lvl3
│   └── file_test_lvl2
└── file_test_lvl1

输出将如下所示,具体取决于 incl_dirsrecursive 是否已设置(或未设置)。

#No directories presented.
#Recursive.
list_files("dir_test_lvl0", incl_dirs = FALSE, recursive = TRUE, full.names = FALSE)
# [1] "file_test_lvl4" "file_test_lvl3" "file_test_lvl2" "file_test_lvl1"

#No directories presented.
#Non-Recursive.
list_files("dir_test_lvl0", incl_dirs = FALSE, recursive = FALSE, full.names = FALSE)
# [1] "file_test_lvl1"


#With directories presented (default list.files() behavior).
#Non-recursive.
list_files("dir_test_lvl0", incl_dirs = TRUE, recursive = FALSE, full.names = FALSE)
# [1] "dir_test_lvl1"  "file_test_lvl1"


#With directories presented (default list.files() behavior).
#Recursive.
list_files("dir_test_lvl0", incl_dirs = TRUE, recursive = TRUE, full.names = FALSE)
# [1] "dir_test_lvl1"  "dir_test_lvl2"  "dir_test_lvl3"  "dir_test_lvl4"  "file_test_lvl4"
# [6] "file_test_lvl3" "file_test_lvl2" "file_test_lvl1"

所有其他 list.files() 选项都由 list_files() 忠实地传递给它。该函数没有外部依赖项(仅限 base R)。