我需要将以下内容简化为单个find
语句。
$ find . -print | grep dir
$ find . -print | grep ch
给我的唯一提示是阅读man
页面来设法做到这一点。我通读了一遍,得出了以下结论,有人能告诉我,我的想法是否正确,或者他们是否可以指导我去一个有用的网站,在那里我可以更多地了解减少管道。
尝试在单行中执行此操作:
$ find . -print | grep dir && grep ch
$ find . -print | grep dir , grep ch
或使用printf。
以上内容有意义吗?还是会给我:未找到?
使用find
和-name
选项,通过-o
(=逻辑or
(连接,如下所示:
find . ( -name '*dir*' -o -name '*ch*' )
两行都使用以下表达式作为输入:
find . -print
因此,您要做的是将计算该表达式的结果通过管道传输到两个grep调用。
find . -print | (grep dir; grep ch)
注:由于短路评估,您需要小心地做一些类似于您之前提出的解决方案的事情。那就是
find . -print | expr1 && expr 2
仅当expr1返回True、正值或非null值时(因为对于和,两个操作数都需要为True才能返回True(,才计算这两个值。在您的情况下,您希望grep-dir和grep-ch每次都进行评估,而不管第一个grep是否找到了任何东西。
find . -print | expr1 || expr 2
如果expr1返回True、正值或非零值(因为或只要求一个操作数为True才能返回True(,则此操作不会计算expr2。
而不是&;或||,请使用分号。
expr1; expr2
echo hello; echo world
这是一种将两个表达式分组的干净方法,其中一个表达式在逻辑上不依赖于另一个表达式的输出。