Xargs `-J` 选项

Bre*_*sze 3 options xargs

该站点xargs命令提供了一个-J选项,可以将标准输入传递到命令参数处的所需位置:

find . -name '*.ext' -print0 | xargs -J % -0 rsync -aP % user@host:dir/
Run Code Online (Sandbox Code Playgroud)

但在GNU xargs 手册页中,此选项不存在。

对于接受此操作的命令,执行此操作的方法是什么?

小智 5

我不确定这是否是您所期望的,但是在 BSD 世界(例如 macOS)中-I-J它们将多个“行”传递给命令的方式有所不同。例子:

$ ls
file1 file2 file3

$ find . -type f -print0 | xargs -I % rm %
rm file1
rm file2
rm file3

$ find . -type f -print0 | xargs -J % rm %
rm file1 file2 file3
Run Code Online (Sandbox Code Playgroud)

因此,使用-I, xargs 将为单独传递给它的每个元素运行命令。使用-J,xargs 将执行一次命令并连接所有元素并将它们作为参数一起传递。

某些命令(例如rm或 )mkdir可以接受多个参数并以与传递单个参数并多次运行它们相同的方式对其进行操作。但是某些应用程序可能会根据您向它们传递参数的方式而改变。例如tar。您可以创建一个 tar 文件,然后向其中添加文件,或者您可以通过一次性添加所有文件来创建一个 tar 文件。

$ find . -iname "*.txt" -or -iname "*.pdf" -print0 | xargs -0 -J % tar cjvf documents.tar.bz2 %
Run Code Online (Sandbox Code Playgroud)