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' \;
另外,请注意 {}
两边的双引号,用于处理包含空格的文件名。
如果这个问题在某个地方得到了回答,那么我已经花了很长时间进行搜索,但只是没有找到合适的术语来确定它是否完成或如何完成。所以……
是否可以使用一个 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' \;
另外,请注意 {}
两边的双引号,用于处理包含空格的文件名。