Bash Shell脚本-降低管线难度[重复]

qlfbtfca  于 2023-03-30  发布在  Shell
关注(0)|答案(2)|浏览(102)

此问题在此处已有答案

Using find to locate files that match one of multiple patterns(12个答案)
两年前关闭了。
我需要将下面的语句简化为一个find语句。

$ find . -print | grep dir
$ find . -print | grep ch

唯一的提示是给我的是阅读man页,以管理这样做。我通读了它,并有以下结论,有人能告诉我,如果我正在作出正确的思考,或如果他们可以引导我到一个有用的网站,我可以了解减少管道更多。
尝试在单行中执行此操作:

$ find . -print | grep dir && grep ch
$ find . -print | grep dir , grep ch

或者使用printf
上述内容是否有意义,或者是否会给予我:* 未找到 *?

wgeznvg7

wgeznvg71#

使用find-name选项,通过-o(=逻辑or)连接,如下所示:

find . \( -name '*dir*' -o -name '*ch*' \)
1wnzp6jl

1wnzp6jl2#

这两行都使用以下表达式作为输入:

find . -print

因此,您要做的是将该表达式的计算结果通过管道传递给两个grep调用。

find . -print | (grep dir; grep ch)

注意:由于短路评估,您需要小心地执行类似于您之前提出的解决方案的操作。即-

find . -print | expr1 && expr 2

只有当expr 1返回True、正数或非空值时,才会对两者求值(因为两个操作数都需要为true,并且返回true)。在您的示例中,您希望每次都对grep dir和grep ch求值,而不管第一个grep是否找到任何内容。

find . -print | expr1 || expr 2

如果expr 1返回True、正值或非空值,则不会计算expr 2(因为或仅需要一个操作数为true即可返回true)
而不是&&或||,使用分号。

expr1; expr2

echo hello; echo world

这是对两个表达式进行分组的一种简洁方法,其中一个表达式在逻辑上不依赖于另一个表达式的输出。

相关问题