有什么区别:
find .
和
find . -print
实际上是做什么的-print
?
$ find .
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
$ find . -print
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
答案1
来自findutils
find
联机帮助页:
如果没有给出表达式,则表达式
-print0
相反,无论如何)。
(-print
是一个find
表达.)
这POSIX 文档证实了这一点:
如果不表达存在,-打印应用作表达式。
所以find .
完全等同于find . -print
;第一个没有表达式,因此-print
在内部添加。
-print
联机帮助页中进一步解释了其含义:
真的;在标准输出上打印完整的文件名,后跟换行符。如果您将 find 的输出通过管道传输到另一个程序中,并且您正在搜索的文件极有可能包含换行符,那么您应该认真考虑使用
-print0
选项而不是
答案2
-print
是默认值行动。一些find
谓词被认为是行动相对于过滤器或者状况。例如,-type f
不是一个动作。-exec
是一个动作,尽管它也可以用作条件。
行动包括-print
、-exec
和-ok
。某些find
实现具有其他非标准操作谓词,例如-print0
, -printf
, -execdir
, -okdir
, -ls
...
find files <some-predicates>
其中没有一个<some-predicates>
包含行动相当于:
find files \( <some-predicates> \) -print
(注意上面的括号,如果有一些-o
运算符,这很重要)。
如有疑问,最好是-print
显式使用(或-exec printf '%s\0' {} +
(或-print0
在可用的情况下)以便可以对输出进行后处理)。
默认-print
操作由 POSIX 指定。一些旧的find
实现需要显式的-print
,但如今在野外通常找不到这些。
另请注意,某些find
实现允许省略files
,在这种情况下,它们默认搜索当前目录。也就是说,对于他们来说,
find
find -print
相当于
find .
find . -print
然而,这不是标准的,所以最好避免。
在更详细(且有用)的范围内,某些find
实现还允许将文件路径作为参数传递给-f
选项,如下所示:
find -f "$file1" -f "$file2" -print
它们是唯一find
允许将任意文件路径传递到find
.其他实现不能接受像!
or -print
... 这样的文件路径,所以find "$file" -print
(甚至find -- "$file" -print
) 假设不是谓词(或第一种情况下的选项)$file
的名称。find
不幸的是,这既不标准也不便携。
答案3
答案4
多年来,find 命令没有默认操作。一个常见的错误是忘记将 -print 选项添加到 find 命令中。直到今天我仍然习惯性地打字。
但在某些时候它被添加为默认操作,因此现在find .
和find . -print
是等效的。