我使用-print0来修改find的输出以使用NULL终止符而不是换行符.但是,当使用find的-o(OR)函数时,我无法使其工作.
这样可以正常工作,它会打印出一个以换行符分隔的文件列表,这些文件不是由用户'pieter'拥有或者不是由'www-data'组拥有的:
find . ! -user pieter -o ! -group www-data
Run Code Online (Sandbox Code Playgroud)
但是当我将-print0附加到此时,我再也没有输出:
find . ! -user pieter -o ! -group www-data -print0
Run Code Online (Sandbox Code Playgroud)
然而,这工作正常:
find . ! -user pieter -print0
Run Code Online (Sandbox Code Playgroud)
我错过了什么?我已经尝试添加各种括号括号,但无济于事.
你错过了parens.请注意,您必须转义它们,以便shell传递它们:
find . \( ! -user pieter -o ! -group www-data \) -print0
Run Code Online (Sandbox Code Playgroud)
您可以在其手册页上找到有关查找的更多信息,尤其是在"示例"部分中.
如果您想知道为什么这是必要的,那是因为操作的顺序.find中的每个表达式都返回true或false.假设您没有在表达式之间放置显式运算符(-a,-o或,)-a.
因此,您的原始命令等同于find . ! -user pieter -o ! -group www-data -a -print0,它仅评估print0用户拥有的文件pieter,而不评估组www-data.