Rorschach
Rorschach

Reputation: 32426

List only files but not directories using list.files

How can I list only files, but not directories using list.files (not recursively)? It has an include.dirs argument, but this is ignored when not being used recursively.

I had been thinking something like

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

but that doesn't seem to work, or a few variations on it. Is there a regex that I can plug in here or a function. I know I can do list.dirs and take a setdiff, but this is already slow enough, I want this to be quicker.

PS: currently on linux, but need something that works cross-platform.

PPS: file.info is really slow, so I think that is also not going to work.

PPPS: It doesn't need to be list.files, that is just the function I had thought should do it.

Upvotes: 4

Views: 1518

Answers (1)

Parfait
Parfait

Reputation: 107577

Consider this regex pattern that matches any file containing letters or numbers and contains the dot extension (to leave out subdirectories but unfortunately files without extensions):

# 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=("*[.]"))

Some other regex variations to catch files with periods (note these also get directories with periods and miss files with no extensions)

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

And using system2 with ls seems to work pretty well (thanks @42- as well from comments),

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

should get only regular files (including ones without extensions), or

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

should return files with directories having a "/" appended so they can be determined.

For an alternative open-source solution, consider the Python solution that allows you to condition if item is a directory and using os.path.join() is agnostic to any OS platform.

import os

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

Upvotes: 2

Related Questions