Bash Shell脚本-减少管道的难度



我需要将以下内容简化为单个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

这是一种将两个表达式分组的干净方法,其中一个表达式在逻辑上不依赖于另一个表达式的输出。

相关内容

  • 没有找到相关文章

最新更新