查找 (unix) - 将标准输出从多个 -exec 主路由到多个文件



如果在某处回答了这个问题,那么我花了很长时间搜索,但只是没有找到正确的术语来了解它是否或如何完成。所以。。。

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

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

find -L ~ -type l -print

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

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

这很好用(我已经用一些围绕各种嵌入式ls命令的echo命令对其进行了测试),但是当我尝试将每个ls命令的标准输出重定向到不同的文件时,如下所示:

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

两个ls命令的输出最终出现在指定的最后一个文件 ( ls2 )。我猜重定向是作为find命令的一部分进行的,并且最后一次重定向必须覆盖之前的重定向。我尝试在重定向周围加上引号以使它们成为ls命令的一部分,但随后它们被ls作为文件名,并且我尝试在>之前使用反斜杠()具有类似的结果。我不确定是否可以完成,但如果可以,我找不到正确的语法。有人可以启发我可以做什么吗?(我真的不是在寻找完成此特定任务的"最佳方法",因为我可以想到很多其他方法可以完成,但真的很想知道是否可以以某种方式在一个查找命令中完成多个重定向。谢谢。

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

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

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

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

最新更新