当使用命令时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: \; -false
,DIR:
当且仅当当前文件属于目录类型时,它才会回显。尾随的-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
本答案开头所示的方法即可;这是最简单的解决方案。