【问题标题】:List only files but not directories using list.files使用 list.files 仅列出文件而不列出目录
【发布时间】:2015-12-02 18:51:51
【问题描述】:

如何使用list.files(不递归)仅列出文件,而不列出目录?它有一个include.dirs 参数,但在不递归使用时会被忽略。

我一直在想类似的事情

list.files(path=myDir, pattern="[^/]$")

但这似乎不起作用,或者有一些变化。有没有我可以在这里插入的正则表达式或函数。我知道我可以list.dirssetdiff,但这已经够慢了,我希望它更快。

PS:目前在 linux 上,但需要一些可以跨平台工作的东西。

PPS:file.info 真的很慢,所以我认为这也行不通。

PPPS:不一定是list.files,这只是我认为应该做的功能。

【问题讨论】:

  • 我认为您找不到比 f <- function() {setdiff(list.files(), list.dirs(full.names=FALSE, recursive=FALSE))}; f() 快得多的东西。
  • 所有文件都有扩展名吗? list.files('~/desktop', full.names = TRUE, pattern = '\\.\\w+$')
  • 来个system("ls <args>") 电话怎么样?

标签: regex r directory


【解决方案1】:

考虑这个匹配任何包含字母或数字并包含点扩展名的文件的正则表达式模式(省略子目录但不幸的是没有扩展名的文件):

# WITH ANCHORING
files <- list.files(path, pattern=("[a-zA-Z0-9]*[.][a-zA-Z0-9]*$"))

# MATCHING LETTER AND/OR NUMBER FILES WITH EXTENSION
files = list.files(myDir, pattern=("[a-zA-Z0-9]*[.]"))

# WILDCARD FILE MATCHING WITH EXTENSION
files = list.files(myDir, pattern=("*[.]"))

一些其他的正则表达式变体来捕获带有句点的文件(注意这些也可以获取带有句点的目录并错过没有扩展名的文件)

list.files(pattern="\\..+$")
list.files(pattern="\\.[[:alnum:]]+$")

使用system2ls 似乎效果很好(感谢@42- 以及来自 cmets),

system2("ls", args=c("-al", "|", "grep", "^-"))

应该只获取常规文件(包括没有扩展名的文件),或者

system2("ls", args=c("--classify"))

应该返回带有附加“/”的目录的文件,以便可以确定它们。

对于另一种开源解决方案,请考虑Python 解决方案,该解决方案允许您判断项目是否为目录,并且使用os.path.join() 与任何操作系统平台无关。

import os

files = [f for f in os.listdir(myDir) if os.path.isfile(os.path.join(myDir, f))]

【讨论】: