8

考虑以下:

$ 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。谢谢。

4

3 回答 3

15

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

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

于 2011-06-29T21:09:08.443 回答
3

POSIX 标准要求

-L 数字

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

-n 数字

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

(添加了重点。)由于echo *生成单行,xargs -L 1只需一次性提供所有文件名ls,然后才能ls很好地对齐列。

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

于 2011-06-29T21:10:33.660 回答
1

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

这应该澄清geekosaur进一步所说的:

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不是。

于 2021-02-01T13:04:05.247 回答