在 `find` 中,使用像 `-type d` 这样的测试后,我怎样才能在某个时候撤消此设置,以便其余部分按 `-type d` 不存在的方式进行评估?

在 `find` 中,使用像 `-type d` 这样的测试后,我怎样才能在某个时候撤消此设置,以便其余部分按 `-type d` 不存在的方式进行评估?

当使用命令时find,我经常需要进行流控制,例如if .. then。

一个简化的例子;

find ~ -maxdepth 1 -type d -exec echo -e "\nnext beg of new dir::" \; -exec ls -lad \{\} \;

-type d如果当前文件属于目录类型,则测试返回 true,因此我会看到空白行和后面跟着目录的通知。

然而我希望接下来显示每个文件、目录或非目录-exec的输出。ls

-o使用第二个选项之前的选项-exec不是解决方案。这会反转流控制,列出不是目录的文件。就像如果给出-not -type d

解决方案似乎是在编写两个选项时,-not -type d-o,如下所示:

find ~ -maxdepth 1 -type d -exec echo -e "\nnext beg of new dir::" \; -not -type d -o -exec ls -lad \{\} \;

这是“撤消”的官方方式吗-type d

答案1

如果你使用find的是 GNU,find那么它支持-true始终评估为真和-false始终评估为假。那么你可以这样做:

# with GNU find
find . -type d -exec echo DIR: \; -false -o -print

第一部分是-type d -exec echo DIR: \; -falseDIR:当且仅当当前文件属于目录类型时,它才会回显。尾随的-false 担保这部分失败;即使-type d评估结果为真,它也会失败。换句话说,这部分不可能成功,因为它成功的唯一方法是评估结果-type d为真并且-exec echo DIR:为真 -false为真。但-false永远无法评估为真。

前面的部分-o总是会失败,因此-print将对每个文件进行评估,就好像-type d不存在一样。

POSIX-ly,您可以使用-exec false \;for-false-exec true \;for -true

# POSIX-ly
find . -type d -exec echo DIR: \; -exec false \; -o -print

在这种情况下,您可以避免生成false附加进程。请使用以下技巧:

# POSIX-ly
find . -type d -exec echo DIR: \; ! -type d -o -print

再次强调,之前的部分-o不可能为真(-type d并且! -type d不可能同时为真),这保证了所需的逻辑。该代码片段! -type d -o相当于您在问题中使用的代码(!是的可移植等效代码-not),没有任何问题。

请注意,这个技巧要求你否定一些先前的测试,而-exec false \;它是通用的。-false也是通用的,但你的find可能支持也可能不支持。如果你find支持-false并且可移植性不是问题,那么只需使用-false -o本答案开头所示的方法即可;这是最简单的解决方案。

相关内容