Find (unix) - 将标准输出从多个 -exec 初选路由到多个文件

Find (unix) - routing standard output from multiple -exec primaries to multiple files

如果这个问题在某个地方得到了回答,那么我已经花了很长时间进行搜索,但只是没有找到合适的术语来确定它是否完成或如何完成。所以……

是否可以使用一个 Unix find 命令执行多个其他命令,使用多个 -exec 原语将每个嵌入式命令的标准输出写入不同的输出文件?我知道我可以将结果通过管道传递给进一步的命令来处理各种需求,但我真的想知道是否可以通过以下方式使用多个重定向。 (顺便说一句,我不担心安全问题……这只是针对我自己机器上的临时请求

我想使用 find 在我的主目录树中找到所有损坏的符号 link,如下所示:

find -L ~ -type l -print

但我想获取结果并为找到的每个损坏的 link 执行两个不同的 ls 命令(ls {} 只获取路径和 ls -l {}获取路径列表和文件,它们应该 linking to ):

find -L ~ -type l -exec ls {} \; -exec ls -l {} \;

效果很好(我已经用围绕各种嵌入式 ls 命令的一些 echo 命令测试了它)但是当我尝试重定向每个 [=16] 的标准输出时=] 命令到不同的文件,如下所示:

find -L ~ -type l -exec ls {} >>ls1 \; -exec ls -l {} >>ls2 \;

两个 ls 命令的输出都在指定的最后一个文件 (ls2) 中结束。我猜测重定向被作为 find 命令的一部分,并且最后的重定向必须覆盖它之前的重定向。我试过在重定向周围加上引号,使它们成为 ls 命令的一部分,但随后它们被 ls 作为文件名,我试过使用反斜杠 (\)在具有相似结果的 > 之前。我不确定它是否可以完成,但如果可以的话我找不到正确的语法。有人可以启发我可以做什么。 (我真的不是在寻找 'best ways' 来完成这个特定的任务,因为我可以想到很多其他的方法来完成它,但我真的很想知道具体是否可以在一个 find 命令中完成多个重定向某种方式。)谢谢。

不,那行不通。 bash 在 调用 find 之前处理重定向 ,因此 find 不会看到它们。如果 find 会看到它们,它也无法处理它们,因为 find 没有选择进行任何重定向。

因此,要使代码简短,您可以做的最好的事情是:

find -L ~ -type l -exec bash -c 'ls "{}" >>ls1' \; -exec bash -c 'ls -l "{}" >>ls2' \;

另外,请注意 {} 两边的双引号,用于处理包含空格的文件名。