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

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

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


当前回答

在您的示例中,将find的输出输送到xargs的目的是,find的-exec选项的标准行为是对每个找到的文件执行一次命令。如果您正在使用find,并且想要它的标准行为,那么答案很简单——一开始就不要使用xargs。

其他回答

在您的示例中,将find的输出输送到xargs的目的是,find的-exec选项的标准行为是对每个找到的文件执行一次命令。如果您正在使用find,并且想要它的标准行为,那么答案很简单——一开始就不要使用xargs。

您可以分别使用——max-lines或——max-args标志限制行数或参数(如果每个参数之间有空格)。

-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. --max-lines[=max-lines], -l[max-lines] Synonym for the -L option. Unlike -L, the max-lines argument is optional. If max-args is not specified, it defaults to one. The -l option is deprecated since the POSIX standard specifies -L instead. --max-args=max-args, -n max-args Use at most max-args arguments per command line. Fewer than max-args arguments will be used if the size (see the -s option) is exceeded, unless the -x option is given, in which case xargs will exit.

下面的命令将找到/path中的所有文件(-type f),然后使用cp将它们复制到当前文件夹。注意,使用if -I %在cp命令行中指定一个占位符,以便参数可以放在文件名之后。

find /path -type f -print0 | xargs -0 -I % cp %。

用xargs (GNU findutils) 4.4.0测试

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

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

示例用例:

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

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

find path -type f | xargs -L1 command 

这就是你所需要的。