2010-10-14 75 views
21

我试图运行使用“EXEC”任务蚂蚁以下命令:如何使用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'。有什么建议么?

+1

它看起来好像只需编写一个简单的ant任务就可以实现这一点,而不是使用exec。 – Chii 2010-10-15 13:54:51

+2

已经有这样一个任务,称为'resourcecount'。 – JesperE 2010-12-10 08:18:30

回答

31

如果使用sh -c亚伦建议,您可以通过整个管道作为一个单一的精氨酸,切实做好:

sh -c "ls -l foo/bar | wc -l" 

如果使用单独指定参数时,它们是由SH消耗,而不是通过ls(因此您只能看到当前目录)。

请注意,在我的系统上,ls -l包含一个总计以及一个找到的文件列表,这意味着显示的计数比文件数多一个。因此建议:

<exec executable="sh" outputproperty="noOfFiles"> 
    <arg value="-c" /> 
    <arg value="ls foo/bar | wc -l" /> 
</exec> 
+0

谢谢Martin,这解决了我面临的问题。谢谢Aaron。 – 2010-10-14 09:43:20

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> 
+0

嗨亚伦 - 它几乎工作!它似乎忽略了/ foo/bar目录,并只计算当前目录中的文件数量。 – 2010-10-14 09:16:44

+0

尝试'/ bin/ls -1'(一个,不是i或L),并且始终使用绝对路径。 – 2010-10-14 09:35:51

+0

'ls -l/foo/bar | wc -l应该都是/ bin/sh的单个参数。 – JesperE 2010-12-10 08:16:34

5

如果您只是要计算目录中的文件,请不要使用外部shell。使用resourcecount任务。快速,小巧,便携,易于阅读:

<resourcecount property="numfiles"> 
    <fileset dir="."/> 
</resourcecount> 

而且你当然可以定制fileset只包括你所需要的特定文件。 (实际上很少有你需要产生一个外部shell的情况,Ant内置的I/O转向器和输入/输出过滤器链通常可以用便携的方式完成同样的事情,即使它有时是有点啰嗦)。

+0

感谢您的评论JesperE。我会研究资源计数,并用它替换我现有的解决方案。干杯 – 2010-12-10 10:38:48

+0

另一个答案是我正在寻找的答案,但+1是为原始问题提供最佳答案。 – undefined 2013-03-29 00:28:09