查找(unix) - 将多个执行原色的标准输出路由到多个文件

时间:2015-01-11 14:19:24

标签: bash shell unix

如果在某个地方得到了回答,那么我花了很长时间搜索,但却找不到合适的术语来查明是否或如何完成。所以......

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

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

find -L ~ -type l -print

但是我想结果并为找到的每个断开的链接执行两个不同的ls命令(ls {}以获取路径,并ls -l {}获取一个列表路径和它们应链接到的文件):

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

运行良好(我已经使用围绕各种嵌入式echo命令的一些ls命令进行了测试,但是当我尝试重定向每个ls的标准输出时命令到这样的不同文件:

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

两个ls命令的输出最终都在指定的最后一个文件(ls2)中。我猜测重定向是作为find命令的一部分进行的,并且最后一次重定向必须覆盖它之前的重定向。我尝试在重定向周围加上引号,使它们成为ls命令的一部分,但后来它们被ls视为文件名,我尝试使用反斜杠(\)在>之前有类似的结果。我不确定它是否可以完成,但如果可以,我找不到合适的语法。有人可以告诉我可能会做些什么。 (我真的不是在寻找执行这项特定任务的“最佳方法”,因为我可以想到其他许多方法可以完成但是我真的想知道在一些查找命令中是否可以进行多次重定向方式。)谢谢。

1 个答案:

答案 0 :(得分:1)

不,那不会奏效。 bash会在强调<{>}之前处理重定向,因此find无法看到它们。如果find会看到它们,它就无法处理它们,因为find无法进行任何重定向。

因此,保持代码简短的最佳方法是:

find

另外,请注意添加find -L ~ -type l -exec bash -c 'ls "{}" >>ls1' \; -exec bash -c 'ls -l "{}" >>ls2' \; 周围的双引号以处理包含空格的文件名。