find -exec 中的管道命令?

For*_*ign 8 shell pipe find

假设我想查找所有.txt文件并搜索一些字符串。我会做:

find ./ -type f -name "*.txt" -exec egrep -iH 'something' '{}' \;
Run Code Online (Sandbox Code Playgroud)

如果我想做一个更复杂的过滤怎么办,像这样:

egrep something file.txt | egrep somethingelse | egrep other
Run Code Online (Sandbox Code Playgroud)

里面find -exec?(或类似)

请记住,我正在寻找一种可以在需要时轻松输入的解决方案。我知道这可以使用 shell 脚本通过几行来完成,但这不是我想要的。

ter*_*don 15

如果必须在 find 中执行此操作,则需要调用 shell:

find ./ -type f -name "*.txt" -exec sh -c 'grep -EiH something "$1" | grep -E somethingelse | grep -E other' sh {} \;
Run Code Online (Sandbox Code Playgroud)

其他替代方法包括使用xargs

find ./ -type f -name "*.txt" | 
    xargs -I{} grep -EiH something {} | 
        grep -EiH somethingelse | 
            grep -EiH other
Run Code Online (Sandbox Code Playgroud)

或者,对于任意文件名更安全(假设您find支持-print0):

find ./ -type f -name "*.txt" -print0 | 
    xargs -0 grep -EiH something {} | 
        grep -Ei somethingelse | 
            grep -Ei other
Run Code Online (Sandbox Code Playgroud)

或者,您可以只使用 shell 循环:

find ./ -type f -name "*.txt" -print0 | 
    while IFS= read -d '' file; do 
        grep -Ei something "$file" | 
            grep -Ei somethingelse | 
                grep -Ei other
    done
Run Code Online (Sandbox Code Playgroud)

  • 第一个正是我正在寻找的。非常简单且小,足以根据我的需要进行打字。谢谢。 (2认同)
  • ... 并且 `xargs` 也可以用作 `xargs -I {} sh -c '...' sh {}`,如果愿意的话(它可以使用 `-P` 运行并行作业,如果一个想要)。 (2认同)