这不是 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 和-0
xargs 中:
find . -maxdepth 1 -type d -print0 | xargs -0 svn info | grep URL
如果您正在处理只能接受 1 个参数的程序,则可以使用-n1
xargs:
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