使用list.files

时间:2015-12-02 18:51:52

标签: regex r directory

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

我一直在想类似

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

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

PS:目前在Linux上,但需要跨平台工作的东西。

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

PPPS:它不需要是list.files,这只是我认为应该这样做的功能。

1 个答案:

答案 0 :(得分: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-以及评论),

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

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

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

应返回包含&#34; /&#34;的目录的文件附上所以他们可以确定。

对于替代的开源解决方案,请考虑Python解决方案,该解决方案允许您调整item是否为目录,并且os.path.join()与任何OS平台无关。

import os

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