对于“xargs”,“-L1”和“-n 1”是否相同?

对于“xargs”,“-L1”和“-n 1”是否相同?

安全地搜索和删除文件

locate  -i nohup.out | xargs -d '\n' -L1 -p rm

locate 输出中的每一行都被 xargs 视为参数,那么 和 是-L1相同-n 1的吗?

答案1

从手册中:

-L max-lines
每个命令行最多使用 max-lines 非空白输入行。尾随空白导致输入行在逻辑上继续到下一个输入行。意味着-x。

-n max-args
每个命令行最多使用 max-args 个参数。如果超出大小(请参阅 -s 选项),则将使用少于 max-args 的参数,除非给出 -x 选项,在这种情况下 xargs 将退出。

-d delim
输入项以指定字符终止。 [...]

基于此和我的理解,在您的情况下,-L1通过传递的参数和参数将分隔符从空格更改为(换行符)来-n1使 和 等效1\n-d

例如,如果没有-d参数,如果您的定位输出中有一个空格,那么这一行将被分成两个参数,因此 rm with 的 2 种不同用法-n1,而它仍然被视为一个参数和只有一个命令和-L1

答案2

根据阅读手册,差异似乎在于-L过滤器非空白线,而-n没有。假设locate永远不会输出仅包含空格的行,因此在此用例中它们在功能上应该是相同的。

答案3

-n在任何空格上分割,-L在换行符上分割

因此,它们会产生不同的结果:

printf '1 2\n3 4\n' | xargs -L1 echo

按行分割,因此相当于:

echo 1 2
echo 3 4

其输出:

1 2
3 4

然而:

printf '1 2\n3 4\n' | xargs -n1 echo

在任何空格上分割,因此相当于:

echo 1
echo 2
echo 3
echo 4

并产生:

1
2
3
4

有关的:https://stackoverflow.com/questions/6527004/why-does-xargs-l-yield-the-right-format-while-xargs-n-doesnt

答案4

选项 -L 是 XSI 扩展,不需要出现在嵌入式系统上。

-n 选项是基本标准的一部分并且始终有效。

请参阅标准作为参考:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html

请注意,某些实现还可能会切换以空格结尾的行的行为,而其他实现可能会连接以空格结尾的行,无论是否指定了 -L 选项。

相关内容