Mac 上“find -type d”的替代方法是什么?

Sen*_*jai 1 bash command-line macos

在 Linux 上find -type d工作列出所有子目录,忽略文件。

但是,当我在 Mac (High Sierra) 上运行它时,出现错误:find: illegal option -- t.

在深入研究谷歌时,除了建议我使用ls和解析输出的答案外,我还没有找到任何明显的命令行替代grep方案,或者为 GUI 应用程序或非命令行用户提供解决方案(通过 finder 等) .)

用例是将此输出通过管道传输到模糊查找器,该查找器需要换行符分隔的项目列表。例如,我可以使用文件和ripgreprg --files -g "" | fzy. Ripgrep 似乎不支持--folders我在 github 问题跟踪器上粗略浏览的选项等。

在 Linux 上find -type d | fzy“正常工作”。直到安装其他软件包,但我真的希望预先安装一些东西。

我可以通过一些脚本来解决这个问题,但我很想听听这里的最佳实践。

Kam*_*ski 6

我认为您find 确实理解,-type d因为这是POSIX要求的。但是您使用的语法:

find -type d
Run Code Online (Sandbox Code Playgroud)

不符合 POSIX,因此不可移植。正确的可移植语法是:

find path -type d
Run Code Online (Sandbox Code Playgroud)

的Linux版本find将假设./,如果你省略path。在 Mac 上find期望是这样的

find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
Run Code Online (Sandbox Code Playgroud)

您想-type成为expression您的find需求path或其-f path命令行参数的一部分。在它得到一个之前,它试图将其他参数解释为选项,所以你-type实际上是-t -y -p -e; 没有-t定义选项,因此illegal option -- t

(比较这个答案)。

解决方案很简单:明确指定一个path。相当于 Linux 的 Macfind -type d是:

find ./ -type d
Run Code Online (Sandbox Code Playgroud)

请注意,这也适用于 Linux。

  • @paradroid 可能不是一个坏习惯。我只是倾向于添加尾部斜杠来表示对象是一个目录。不过,在某些情况下 [这会有所作为](https://superuser.com/a/1320435/432690)。 (2认同)