在 Linux 上find -type d
,列出所有子目录,忽略文件。
但是,当我在 Mac(High Sierra)上运行它时,出现错误:find: illegal option -- t
。
深入研究谷歌后,我没有找到任何明显的替代命令行等效方法,除了建议我使用ls
和解析输出的答案grep
,或者为GUI应用程序或非命令行用户(通过finder等)提供解决方案。
用例是将此输出通过管道传输到模糊查找器,该查找器需要以换行符分隔的项目列表。例如,我可以使用文件和以下内容实现此目的ripgrep
:rg --files -g "" | fzy
。从我在 github 问题跟踪器上的粗略浏览来看,Ripgrep 似乎不支持--folders
选项或类似的东西。
在 Linux 上find -type d | fzy
“就可以正常工作”。可以安装其他软件包,但我真的希望能安装一些预安装的软件包。
我可以通过一些脚本来解决这个问题,但我很想听听这里的最佳做法。
答案1
我认为你的find
做理解-type d
,因为这是POSIX 要求。但是您使用的语法:
find -type d
不符合 POSIX 标准,因此不可移植。正确的可移植语法是:
find path -type d
Linux 版本find
将假设./
如果你省略path
。在 Mac 上,find
需要一些像这样:
find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
您想-type
成为其中的一部分,expression
但您的find
需求path
或-f path
在其命令行参数中。在获得一个参数之前,它会尝试将其他参数解释为选项,因此您的参数-type
实际上是-t -y -p -e
;没有-t
定义选项,因此illegal option -- t
。
(比较这个答案)。
解决方案很简单:path
明确指定。Mac 中与 Linux 对应的方法find -type d
是:
find ./ -type d
请注意,这在 Linux 中也有效。