为什么xargs -L产生正确的格式,而xargs -n不能?

时间:2011-06-29 20:42:41

标签: linux shell unix whitespace xargs

请考虑以下事项:

$ echo index.html* | xargs -L 1 ls -l
-rw-r--r-- 1 zeki zeki  17198 2011-05-03 23:18 index.html
-rw-r--r-- 1 zeki zeki  17198 2011-05-03 23:20 index.html.1
-rw-r--r-- 1 zeki zeki  17198 2011-05-03 23:21 index.html.2
-rw-r--r-- 1 zeki zeki 146589 2011-05-05 12:29 index.html.3
$ echo index.html* | xargs -n 1 ls -l
-rw-r--r-- 1 zeki zeki 17198 2011-05-03 23:18 index.html
-rw-r--r-- 1 zeki zeki 17198 2011-05-03 23:20 index.html.1
-rw-r--r-- 1 zeki zeki 17198 2011-05-03 23:21 index.html.2
-rw-r--r-- 1 zeki zeki 146589 2011-05-05 12:29 index.html.3

为什么-n选项会产生不正确的格式?为了以防万一,我在Ubuntu下使用bash。感谢。

3 个答案:

答案 0 :(得分:14)

-L按行分割; echo不会按行而是按空格分隔其输出,因此会运行一个ls -l并将所有列格式化为一个组。

-n按参数拆分;在没有-L-0的情况下,分隔符是空格(可能通过引用修改),因此每个文件名都有自己的ls -l运行,并且独立运行无法协调列宽。

答案 1 :(得分:3)

POSIX标准mandates

  

-L 号码

     

应从标准输入的每个非空number 参数执行该实用程序。如果剩余的数量少于数量,则最后一次调用实用程序应使用较少的参数行。 被视为以第一行结尾,除非该行的最后一个字符是<blank>;尾随<blank>信号延续到下一个非空行,包括在内。

     

-n 号码

     

使用尽可能多的标准输入参数调用实用程序,最多 number (正十进制整数)参数。

(强调已添加。)由于echo *生成一行,xargs -L 1只会立即将所有文件名提供给ls,然后才能ls很好地对齐列。

(换句话说,你的第一个命令是等效的ls -l index.html*,除了它不能正确处理包含空格的文件名。)

答案 2 :(得分:1)

关于 -L 如何按行分割和 -n 按空格分割的最小可运行示例

这应该进一步说明geekosaur said

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://unix.stackexchange.com/questions/448290/are-l1-and-n-1-the-same-for-xargs/448379#448379 所述,-L 的可移植性稍差,因为它是 XSI POSIX 扩展,而 -n 不是。