如何使xargs对给定的每一行输入执行一次命令?
它的默认行为是将行分块并执行一次命令,将多行传递给每个实例。
从http://en.wikipedia.org/wiki/Xargs:
查找/path -type f -print0 | xargs -0 rm
在本例中,find为xargs的输入提供一长串文件名。然后Xargs将这个列表拆分为子列表,并对每个子列表调用rm一次。这比功能等效的版本更有效:
查找/path -type f -exec rm '{}' \;
我知道那个发现有"执行"的标志。我只是从另一种资源中引用了一个说明性的例子。
您可以分别使用——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.
如果你想对来自find的每一行(即结果)运行命令,那么你需要xargs做什么?
Try:
查找路径类型f -exec your-command {} \;
文本{}被文件名代替,而文本\;用于find,以便知道自定义命令在此结束。
编辑:
(在编辑你的问题,澄清你知道-exec之后)
来自man xargs:
- l max-lines
每个命令行最多使用max行非空输入行。落后于
空格使一个输入行在逻辑上被下一个输入行继续。
意味着- x。
注意,如果你使用xargs,以空格结尾的文件名会给你带来麻烦:
$ mkdir /tmp/bax; cd /tmp/bax
$ touch a\ b c\ c
$ find . -type f -print | xargs -L1 wc -l
0 ./c
0 ./c
0 total
0 ./b
wc: ./a: No such file or directory
所以如果你不关心-exec选项,你最好使用-print0和-0:
$ find . -type f -print0 | xargs -0L1 wc -l
0 ./c
0 ./c
0 ./b
0 ./a