该站点提供的xargs
命令带有一个-J
选项,可以将标准输入传递到命令参数的所需位置:
find . -name '*.ext' -print0 | xargs -J % -0 rsync -aP % user@host:dir/
但在GNU xargs 手册页中,此选项不存在。
对于接受此的命令,执行此操作的方法是什么?
该站点提供的xargs
命令带有一个-J
选项,可以将标准输入传递到命令参数的所需位置:
find . -name '*.ext' -print0 | xargs -J % -0 rsync -aP % user@host:dir/
但在GNU xargs 手册页中,此选项不存在。
对于接受此的命令,执行此操作的方法是什么?
我不确定这是您所期望的,但是在 BSD 世界(例如 macOS)中
-I
,-J
它们将多个“行”传递给命令的方式不同。例子:因此
-I
,xargs 将为单独传递给它的每个元素运行命令。使用-J
, xargs 将执行一次命令并连接所有元素并将它们作为参数一起传递。某些命令,例如
rm
ormkdir
可以接受多个参数并以与传递单个参数并多次运行它们相同的方式对它们进行操作。但是某些应用程序可能会根据您向它们传递参数的方式而改变。例如tar
. 您可以创建一个 tar 文件,然后向其中添加文件,或者您可以通过一次性将所有文件添加到其中来创建一个 tar 文件。如果这是
-J
BSD 版本的标志,xargs
我不相信 GNU 有完全等效的选项xargs
。用通过标准输入进入的每一行-J
替换一次出现的replstr(例如)。%
不过,GNU 版本有一个类似的选项:-I
1 . 但是,您可以多次使用replstr和该标志。对于是否有一个或多个命令调用并不重要的用例,您应该能够使用 GNU
xargs -I
作为替代品。但是您的示例使用rsync
并且我确定您不希望多次调用它。那么,您最好的行动方案是考虑以
find
and the-exec
or-execdir
行动开始的替代方案。这些有两种变体。一个类似于 GNU-I
,另一个类似于 BSD-J
。看看这些例子...现在将其与此进行比较:
两者之间的唯一区别是哪个“修饰符”出现在末尾,
+
或者;
。1更令人困惑的是,BSD 版本也有
-I
,并且在功能上-J
与 GNU相似-I
!但这-I
会受到其他标志的影响,并且很可能不是您想要的。