man find
:
-f path:将路径添加到将递归到的路径列表中。当路径以否则会被解释为表达式的字符(即“!”)开头时,这很有用。, “(“ 和 ”-”。
但为什么
find ./test-folder -type f -name '*.txt'
有效,而
find -f ./test-folder -type f -name '*.txt'
不起作用?
那么错误是什么?
./test-folder: illegal option -- t
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
让我们稍微改变一下命令,看看会发生什么:
我完全不确定为什么它会在错误消息中打印给定的路径,但除此之外,很明显是以下内容
-t
产生了错误。这是因为该参数被视为 options 、、和-type
的简写,就像类似的东西具有三个选项、、 和,而不仅仅是选项和文件名。现在,没有选择,所以它抱怨。如上所述,可以工作,当然会抱怨选项 letter 。-t
-y
-p
-e
ls -l -aR
-l
-a
-R
-l
-aR
find
-t
-H
find -f . -depth
e
您需要以 结束选项列表,以
--
使后续参数被视为非选项。这与其他工具相同,find
例如:或者如果您想列出一个名为的文件
-aR
:当然,对于其他工具,问题主要在于诸如
ls *.txt
以 开头的文件名-
可能是问题的情况。人们很少将 glob 与 一起使用find
,但其思想是相同的。与其他工具相同,通常不需要
--
withfind
,只要作为第一个非选项给出的路径是“nice”,例如.
。不以破折号开头的参数隐式结束选项处理。但你可以使用--
:当然,您也可以使用带有 find 的 glob,例如
find -- *.d -name "*.conf"
. 但这并没有什么--
帮助,因为以破折号 (-foo.d
) 开头的名称现在可能会被视为无效谓词。当然,如果表达式以看起来不像选项(
(
或!
)的内容开头,也会停止选项处理,就像注释中提到的命令一样:如果文件名以破折号开头,这也无济于事,所以这就是他们有这个
-f
选项的原因。或者您始终可以在文件名中添加前缀./
,以类似的方式影响输出。作为额外的好处,这也适用于 glob,例如./*.d
.请注意,GNU find 在这里有所不同,它尝试将未知选项解释为谓词:
当然,这是因为它不需要显式给出搜索路径,而是默认为
.
如果没有给出搜索路径。例如,这些是相同的:它也不处理堆叠选项,尽管这可能没问题,因为人们通常不会在 find 中使用多个选项(
-H
,-L
和-P
选项都控制符号链接的处理,并相互覆盖,而-O
和-D
用于优化和调试):似乎不可能让 GNU
-type
在命令行上找到类似文件名的东西。您必须改用./-type
,或通过-files0-from
.在指定任何表达式之前,用于
--
结束搜索路径列表:find
通常
--
表示选项的结束,macOSfind
将其与选项结合使用-f
来表示搜索路径的结束。macOS 手册的“BUGS”部分提到了这一点find(1)
(我的重点):