“find” 命令并通过另一个程序传输其输出

“find” 命令并通过另一个程序传输其输出

这不是 Ubuntu 特有的问题,它适用于所有 unix/linux。

我如何运行这样的命令:

 find .  -maxdepth 1 -type d  -print -exec svn info "{}"   | grep URL  \; 

上面的命令没有达到我想要的效果,我似乎无法将 svn info 的输出通过管道传输到 grep。

这可行,但输出包含的内容远远超出我需要的内容:

 find .  -maxdepth 1 -type d  -print -exec svn info "{}"  \; 

有任何想法吗?

答案1

总体而言,我发现xargs使用 find 的 -exec 选项更合理。这尤其有利于提高速度,因为 find 的输出中不会每行都启动一个单独的“svn”:

find . -maxdepth 1 -type d | xargs svn info | grep URL

如果您正在处理具有奇怪名称(空格,换行符等)的文件,只需将其添加-print0到 find 和-0xargs 中:

find . -maxdepth 1 -type d -print0 | xargs -0 svn info | grep URL

如果您正在处理只能接受 1 个参数的程序,则可以使用-n1xargs:

find . -maxdepth 1 -type d -print0 | xargs -0 -n1 svn info | grep URL

答案2

实际上我发现下面的代码可以实现我想要的功能:

  find .  -maxdepth 1 -type d  -print -exec svn info "{}"   \;  | grep URL

但我仍然想知道如何在 find 的 exec 中管道输出

答案3

您需要一个 shell 来解释管道。

find . -maxdepth 1 -type d -print -exec sh -c 'LANG=C svn info "$1" | grep URL' _ {} \;

http://mywiki.wooledge.org/UsingFind查看更多示例。

不过,我还是会用 for 循环来实现这一点:

for svndir in ./*/.svn/; do
    dir=${svndir%/.svn/}
    echo "$dir"
    LANG=C svn info "$dir" | grep URL
    # or maybe just: sed '5!d;q' "$svndir/entries"
done

答案4

find .  -maxdepth 1 -type d  -print -exec svn info "{}" \; | grep URL

相关内容