请考虑以下事项:
$ 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。感谢。
答案 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
不是。