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

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

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


当前回答

似乎我没有足够的声望对上面的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.

其他回答

find path -type f | xargs -L1 command 

这就是你所需要的。

如果你想对来自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

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

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

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

用xargs (GNU findutils) 4.4.0测试

另一种选择……

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