find -exec 中管道和重定向输出的正确位置?

find -exec 中管道和重定向输出的正确位置?

我在 FreeBSD 上使用控制台中的find选项-exec(例如,find . -exec sha1 {} \;)。

  1. 如何正确放置(如果需要,转义)重定向和其他在语法上适用于 exec 命令或 find 命令的执行控制符号,例如 > >> |和 &,我可能希望符号在不同场合应用于find或命令?exec

  2. 在同一主题上,如果我想使用tee在控制台上查看 -exec 命令的输出(以观察进度)并将其附加到文件(以供以后使用),那么语法是什么?

(我知道 shell 各不相同,但希望最常用的 shell(例如 sh/csh)非常相似?)

更新:

在某种程度上,我想了解嵌套是否find -exec可以在没有脚本的情况下作为一个简单的命令来完成。以下是引发该问题的用例:

  • 外部find:查找所有与 DIR_MATCH_TEXT 匹配的子目录DIR1
  • inside find:对于在外循环中找到的每个匹配的子目录(称为 DIR2),执行命令
    find DIR2 -name "FILE_MATCH_TEXT" -exec sha1 {} \; >> DIR1/DIR2_hashes.txt

目的是创建一组文件,每个文件对应一个匹配的子目录,其中包含find -exec该子目录上某些操作的输出。

我的意思是,如果/backups包含/jan2017/feb2017,则结果将是/backups/jan2017_hashes.txt和处的两个文件/backups/feb2017_hashes.txt,其中包含(例如)中所有 .pdf 文件的jan2017_hashes.txt输出,并包含中所有 .pdf 文件的输出。sha1/backups/jan2017feb2017_hashes.txtsha1/backups/feb2017

从到目前为止的回复来看,我认为外部find必须使用 shell 调用作为-exec? 的参数。

答案1

I/O 重定向和管道是 shell(例如 bash)的功能。查看find命令的源代码(https://www.gnu.org/software/findutils/),该-exec选项分叉并直接执行给定的命令,它不会通过任何 shell 发送它。鉴于此,如果没有帮助,您无法在 的参数中包含管道和重定向find

但是,您可以find调用 shell,然后让该 shell 依次调用您的命令。通过 shell 运行相同的操作时,您可以访问 shell 公开的 I/O 重定向操作。例如考虑:

find . -type f -exec bash -c 'ls -l "$1" >> /tmp/result' find-sh {} \;

它将在由(shell 在此上下文中将该文件引用为)ls -l找到的每个文件上运行,并将输出重定向到。请注意,我使用的是.在这里,find 为每个文件调用一个 shell,因此将导致每个结果覆盖前一个结果 - 您最终将得到一个仅包含最后一个命令的输出的文件。find$0/tmp/result>>>>

管道也可以工作,但有同样的警告“每个文件一个执行程序”。

find . -type f -exec bash -c 'ls -l "$1" | grep something' find-sh {} \;

尽管如此,我并不清楚为什么要在 的上下文中应用重定向-exec,或者对 find 本身的输出执行重定向会给您带来什么。

相关内容