如何使xargs对给定的每一行输入执行一次命令? 它的默认行为是将行分块并执行一次命令,将多行传递给每个实例。

从http://en.wikipedia.org/wiki/Xargs: 查找/path -type f -print0 | xargs -0 rm 在本例中,find为xargs的输入提供一长串文件名。然后Xargs将这个列表拆分为子列表,并对每个子列表调用rm一次。这比功能等效的版本更有效: 查找/path -type f -exec rm '{}' \;

我知道那个发现有"执行"的标志。我只是从另一种资源中引用了一个说明性的例子。


当前回答

在当前或子文件夹的每个build.xml上执行ant任务clean-all。

find . -name 'build.xml' -exec ant -f {} clean-all \;

其他回答

另一种选择……

find /path -type f | while read ln; do echo "processing $ln"; done

如何使xargs对给定的每一行输入执行一次命令?

- l1是一个简单的解决方案,但如果任何文件中包含空格,它就不起作用。这是find的-print0参数的一个关键函数,用'\0'字符而不是空格分隔参数。这里有一个例子:

echo "file with space.txt" | xargs -L 1 ls
ls: file: No such file or directory
ls: with: No such file or directory
ls: space.txt: No such file or directory

更好的解决方案是使用tr将换行符转换为空(\0)字符,然后使用xargs -0参数。这里有一个例子:

echo "file with space.txt" | tr '\n' '\0' | xargs -0 ls
file with space.txt

如果你需要限制调用的次数,你可以使用-n 1参数为每个输入对程序进行一次调用:

echo "file with space.txt" | tr '\n' '\0' | xargs -0 -n 1 ls

这还允许您在将换行符转换为空之前过滤find的输出。

find . -name \*.xml | grep -v /target/ | tr '\n' '\0' | xargs -0 tar -cf xml.tar

似乎我没有足够的声望对上面的Tobia的回答添加评论,所以我添加这个“答案”是为了帮助那些希望在Windows平台上以同样的方式试验xargs的人。

下面是一个windows批处理文件,它做的事情与Tobia快速编码的“show”脚本相同:

@echo off
REM
REM  cool trick of using "set" to echo without new line
REM  (from:  http://www.psteiner.com/2012/05/windows-batch-echo-without-new-line.html)
REM
if "%~1" == "" (
    exit /b
)

<nul set /p=Args:  "%~1"
shift

:start
if not "%~1" == "" (
    <nul set /p=, "%~1"
    shift
    goto start
)
echo.

以下仅在输入中没有空格时才有效:

xargs -L 1
xargs --max-lines=1 # synonym for the -L option

从手册页:

-L max-lines
          Use at most max-lines nonblank input lines per command line.
          Trailing blanks cause an input line to be logically continued  on
          the next input line.  Implies -x.

这两种方法也可以工作,并将适用于其他没有使用find!

xargs -I '{}' rm '{}'
xargs -i rm '{}'

示例用例:

find . -name "*.pyc" | xargs -i rm '{}'

将删除此目录下的所有pyc文件,即使pyc文件包含空格。