Using R - How do I search for a file/folder on all drives (hard drives as well as USB drives)

Messed up a bit in the comment as I misread the thread (you need dirs). You can still do this with list.files() tho. I mocked up a directory structure looking for directories named "data" but also included a file named "data":

(pre <- list.files("/var/tmp/a", "data", recursive=TRUE, full.names=TRUE, include.dirs=TRUE))

## [1] "/var/tmp/a/data"   "/var/tmp/a/l/data" "/var/tmp/a/q/data"

(/var/tmp/a/l/data is actually just a file)

But, you only need/want directories, so if you have a fairly modern R install and the purrr package installed then you can do:

purrr::keep(pre, dir.exists)

## [1] "/var/tmp/a/data"   "/var/tmp/a/q/data"

I see it's an old question, but now we can use the fs package that according to the tidyverse blog and the package vignette "provides a cross-platform, uniform interface to file system operations" and "smooth over some of the idiosyncrasies of file handling with base R functions".

Here's how we can accomplish this task with fs:

fs::dir_ls(path = c("C:/", "E:/"), type = "directory", glob = "*MyFiles", recurse = TRUE)

There are a couple of added advantages to using this approach:

  1. If we have a general sense of where this directory should be in the folder hierarchy, we can recurse upto a certain level instead of searching the entire tree. We just need to add the argument recurse = #num_levels_to_recurse) to the above code.
  2. Also, if we want to list all directories except MyFiles, we can add the argument invert = TRUE to the above code.

These two options are not available in list.files() and list.dirs() functions of base R. Check out this document for a thorough comparison between fs functions and base R functions for file system operations.

Tags:

R