`find -exec` 中的重定向或管道

`find -exec` 中的重定向或管道

周围有任何“find -exec”专家吗?

我有一个需要发送文件的文件夹sendmail(当发生不好的事情时,它们就会出现在那里)。

  • 命令

    find . -type f -exec sendmail -t < {} \;
    

    给我

    -bash: {}: No such file or directory
    

    它好像不太喜欢<

  • 和这个

    find . type -f -exec cat {} |sendmail -t \;
    

    给我

    find: missing argument to `-exec'
    

    它好像不太喜欢|

怎么了?

答案1

看起来您希望此重定向 ( <) 或管道 ( |) 属于-exec … ;语句内部。这行不通,因为它们在find运行之前就由您的 shell 处理了。

为了使它们工作你需要其他shell 内部-exec … ;。另一个 shell 将处理<|。分别:

find . -type f -exec sh -c 'sendmail -t < "$1"' sh {} \;
find . -type f -exec sh -c 'cat "$1" | sendmail -t' sh {} \;

注意:find . -type f -exec sh -c 'sendmail -t < "{}"' \;不太复杂,但错误。解释如下:可以find -exec sh -c安全使用吗?

答案2

在这两种情况下,您的重定向都是由 shell 而不是 解析的find,因此您需要对其进行转义:

find . -type f -exec sendmail -f \< {} \;

按预期工作。

相关内容