Search code examples
directoryoctavecase-sensitivecase-insensitive

Workaround for case-sensitive input to dir


I am using Octave 5.1.0 on Windows 10 (x64). I am parsing a series of directories looking for an Excel spreadsheet in each directory with "logbook" in its filename. The problem is these files are created by hand and the filenaming isn't consistent: sometimes it's "LogBook", other times it's "logbook", etc...

It looks like the string passed as input to the dir function is case-sensitive so if I don't have the correct case, dir returns an empty struct. Currently, I am using the following workaround, but I wondered if there was a better way of doing this (for a start I haven't captured all possible upper/lower case combinations):

logbook = dir('*LogBook.xls*');
if isempty(logbook)
  logbook = dir('*logbook.xls*');
  if isempty(logbook)
    logbook = dir('*Logbook.xls*');
    if isempty(logbook)
      logbook = dir('*logBook.xls*');
      if isempty(logbook)
        error(['Could not find logbook spreadsheet in ' dir_name '.'])
      end
    end
  end
end

Solution

  • You need to get the list of filenames (either via readdir, dir, ls), and then search for the string in that list. If you use readdir, it can be done like this:

    [files, err, msg] = readdir ('.'); # read current directory
    if (err != 0)
      error ("failed to readdir (error code %d): %s", msg);
    endif
    logbook_indices = find (cellfun (@any, regexpi (files, 'logbook'));
    logbook_filenames = files(logbook_indices);
    

    A much less standard approach could be:

    glob ('*[lL][oO][gG][bB][oO][kK]*')