Search code examples
bashmacosfind

Find Command Exclude Hidden files when using empty flag


I am looking for a way to use the find command to tell if a folder has no files in it. I have tried using the -empty flag, but since I am on macOS the system files the OS places in the directory such as .DS_Store cause find to not consider the directory empty. I have tried telling find to ignore .DS_Store but it still considers the directory not empty because that file is present.

Is there a way to have find exclude certain files from what it considers -empty? Also is there a way to have find return a list of directories with no visible files?


Solution

  • The -empty predicate is rather simple, it's true for a directory if it has any entries other than . or ...

    Kind of an ugly solution, but you can use -exec to run another find in each directory which will implement your criteria for deciding what directories you want to include.

    Below:

    • the outer find will execute sh -c for each directory in /starting/point
    • sh will execute another find with different criteria.
    • the inner find will print the first match and then quit
    • read will consume the output (if any) of the inner find. read will have an exit status of 0 only if the inner find printed at least one line, non-zero otherwise
    • if there was no output from the inner find, the outer find's -exec predicate will evaluate to false
    • since -exec is followed by -o, the following -print action will be executed only for those directories which do not match the inner find's criteria
    find /starting/point \
      -type d \( \
        -exec sh -c \
          'find "$1" -mindepth 1 -maxdepth 1 ! -name ".*" -print -quit | read' \
          sh {} \; \
        -o -print \
      \)