我正在尝试使用Ant中的'exec'任务运行以下命令:
ls -l /foo/bar | wc -l
目前,我的执行官看起来像这样:
<exec executable="ls" outputproperty="noOfFiles">
<arg value="-l" />
<arg value="/foo/bar" />
<arg value="|" />
<arg value="wc" />
<arg value="-l" />
</exec>
'ls'命令看起来有效,但很难将输出连接到'wc'。有什么建议吗?
答案 0 :(得分:31)
如果您使用sh -c
作为Aaron建议,您可以将整个管道作为单个arg传递,有效地执行:
sh -c "ls -l foo/bar | wc -l"
如果你使用单独的args,它们会被sh使用,而不是传递给ls(因此你只看到当前目录)。
请注意,在我的系统上,ls -l
包含所有文件的总数和列表,这意味着显示的数量比文件数多一个。所以建议:
<exec executable="sh" outputproperty="noOfFiles">
<arg value="-c" />
<arg value="ls foo/bar | wc -l" />
</exec>
答案 1 :(得分:5)
如果您只想计算目录中的文件,请不要使用外部shell。使用resourcecount
任务。快速,紧凑,便携且易于阅读:
<resourcecount property="numfiles">
<fileset dir="."/>
</resourcecount>
您当然可以自定义fileset
以包含您需要的特定文件。
(实际上很少需要产生外部shell.Ant内置的I / O重定向器和输入/输出过滤器链通常可以以可移植的方式完成同样的事情,即使它有时是一点点冗长。)
答案 2 :(得分:2)
您需要有人识别并构建管道。试试sh
:
<exec executable="sh" outputproperty="noOfFiles">
<arg value="-c" />
<arg value="ls" />
<arg value="-l" />
<arg value="/foo/bar" />
<arg value="|" />
<arg value="wc" />
<arg value="-l" />
</exec>