来自 findutils 的手册:
xargs [option...] [command [initial-arguments]]
我是否正确,在多次运行中xargs
运行command
,每次运行都有不同的参数序列?
如果是,是否意味着这样的命令必须满足将参数序列应用于该命令是实际上与
将参数序列拆分为子序列,并且
在不同的运行中运行带有每个参数子序列的命令?
mycommand
例如,如果可以由 运行xargs
,那么是否正确
mycommand arg1 arg2 arg3
必须实际上与
mycommand arg1
mycommand arg2 arg3
上述条件是命令执行的充分必要条件吗xargs
?
有没有不满足上述条件的命令? (我找不到。)如果有,可以通过 运行吗xargs
?
传递的参数可以xargs
是command
任何类型的参数:选项、选项参数或非选项参数吗?我认为这个问题对于回答上述问题很有帮助。
如果涉及到怎么-i
办xargs
?
谢谢。
答案1
我是否正确地认为 xargs 在多次运行中运行命令,每次运行都具有不同的参数序列?
xargs
是的(当然,除非输入重复)
mycommand arg1 arg2 arg3
必须实际上与
mycommand arg1 mycommand arg2 arg3
差不多,因为一般来说,我们不知道xargs
将在哪里分割列表。 GNU xargs--show-limits
可用于确定所有输入是否适合命令的一次运行。
当然,如果参数必须以一组形式传递给命令氮,我们可以用来对它进行一些控制(或者使用-n N
-n M
中号的一些倍数氮)。
有没有不满足上述条件的命令? (我找不到。)如果有的话,可以通过xargs运行吗?
Kusalananda 提到mv
,它的问题是最后一个参数与其他参数的处理方式不同。实际上,添加的参数xargs
需要转到中间,并且没有标准方法可以做到这一点。 (FreeBSD xargs 可以-J {}
做到这一点,GNUmv
可以-t dir
选择在参数列表的开头传递目标目录。cp
类似。)
那么类似的事情tar -czf foo.tar.gz
就行不通了,因为-c
(创建)会在每次运行时覆盖存档。可以通过使用-r
(append) 而不是来避免这种情况-c
,但至少 GNU tar 不支持附加到压缩存档。
幸运的是,大多数实用程序都是逐个文件工作的,并且设计为在末尾接受文件列表。
xargs 传递给命令的参数可以是任何类型的参数:选项、选项参数或非选项参数吗?
它们只是字符串,xargs
不知道它们的含义。如果您有一个实用程序不接受通常的文件列表,但采用了一个-f filename
选项,您可以安排xargs
获取类似的输入-f file1 -f file2 ...
,它会很乐意将其传递。尽管有大量输入,大小限制可能再次导致 a-f
和文件名之间的分割,但添加类似的内容-n 100
将使这种情况不太可能发生(取决于文件名的长度和实际大小限制)。
如果涉及到xargs的-i怎么办?
-i
在 GNU 中 xargs 与 相同-I {}
,并且有点无聊地xargs
为每个输入参数运行一次命令。如果您需要将参数放在命令的中间,则会有所帮助,但对于减少命令的调用次数并没有真正的帮助。
答案2
该xargs
工具(默认情况下)从标准输入读取以空格分隔的标记,并将它们转换为指定程序的命令行选项。默认情况下,它将采用命令行上可以容纳的尽可能多的令牌,并使用这些令牌运行一次命令:
echo 1 2 3 | xargs echo "-"
- 1 2 3
在这里,xargs
读取 1、2 和 3,然后运行echo "-" 1 2 3
。我添加了 来"-"
帮助弄清楚echo
被调用的次数。
您可以使用以下选项限制传递给命令的参数数量-n
:
echo 1 2 3 | xargs -n2 echo "-"
- 1 2
- 3
在这里,xargs
从其标准输入流读取 2 个标记(最大值),并使用这些标记作为命令行参数运行命令:echo "-" 1 2
。由于它尚未完成从标准输入读取标记,因此它继续读取 3,遇到 EOF,并使用剩余参数再次运行该命令:echo "-" 3
。
调整 的值n
会给你带来不同的行为:
echo 1 2 3 | xargs -n1 echo "-"
- 1
- 2
- 3
编辑:蒂姆评论说我没有回答他的问题。我不同意,并将尝试明确指出以下答案:
我是否正确,在多次运行中
xargs
运行command
,每次运行都有不同的参数序列?
我回答了这个问题。它可以在一次或多次运行中运行命令。默认情况下,它尝试运行command
尽可能少的次数(受参数长度限制)。
如果是,是否意味着这样的命令必须满足以下条件:将参数序列应用于该命令实际上与 (x) 将参数序列拆分为子序列,以及 (x) 使用每个参数子序列运行命令相同不同的跑步?
我回答了这个问题。如果令牌太长(或者受-n
选项限制,则将xargs
它们分成子序列并使用子序列运行命令。我什至给出了发生这种情况的示例。
上述条件是命令执行的充分必要条件吗
xargs
?
虽然我对此没有明确的答案,但我的想法是可以从示例中推断出语义。如果论据command
根据位置具有特殊含义,那么command
可能不是一个好的候选者xargs
(尽管我确信您可以精心设计可行的案例)。
有没有不满足上述条件的命令? (我找不到。)如果有的话,可以通过xargs运行吗?
同样,您可以精心制作这样的案例(但我不推荐这样做)。一个精心设计的示例是(运行mv a.txt b.txt
):
$ ls
a.txt
$ echo a.txt b.txt | xargs mv
$ ls
b.txt
xargs 传递给命令的参数可以是任何类型的参数:选项、选项参数或非选项参数吗?我认为这个问题对于回答上述问题很有帮助。
它们被读取为空格分隔的标记。它们作为空格分隔的参数传递给命令。这将运行ls -l
:
$ echo -l | xargs ls
total 0
-rw-r----- 1 user group 0 Jun 7 15:16 b.txt
如果涉及到怎么
-i
办xargs
?
好吧,我没有回答这个问题,但我不太明白你在这方面要问什么。