MacOS – What’s the alternative for `find -type d` on Mac

bashcommand linemacos

On Linux find -type d works to list all sub directories, ignoring files.

However when I run this on a Mac (High Sierra) I get the error: find: illegal option -- t.

On delving into the googles, I hadn't found any obvious alternative for a command line equivalent except for answers suggesting that I use ls and parse the output via grep, or have solutions for GUI apps or for the non command line users (via finder, etc.).

The usecase would be to pipe this output to a fuzzy finder which expects a newline separated list of items. For example I can accomplish this with files and ripgrep with: rg --files -g "" | fzy. Ripgrep doesn't seem to support a --folders option or the like from my cursory browse on the github issue tracker.

On Linux find -type d | fzy "just works". Up to installing other packages, but I really hoped for something that just comes preinstalled.

I can get away from this with some scripting, but I'd love to hear about a best practice here.

Best Answer

I think your find does understand -type d because this is required by POSIX. However the syntax you used:

find -type d

is not POSIX-compliant, thus not portable. The proper portable syntax is:

find path -type d

Linux versions of find will assume ./ if you omit path. On Mac find expects something like this:

find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]

You want -type to be a part of expression but your find needs path or -f path in its command line arguments. Before it gets one, it tries to interpret other arguments as options, so your -type is in fact -t -y -p -e; there is no -t option defined, thus illegal option -- t.

(Compare this answer).

The solution is simple: specify a path explicitly. Mac equivalent of Linux find -type d is:

find ./ -type d

Note this works in Linux as well.