【问题标题】:Why does xargs -L yield the right format, while xargs -n doesn't?为什么 xargs -L 产生正确的格式,而 xargs -n 没有?
【发布时间】:2021-02-06 18:46:01
【问题描述】:

考虑以下几点:

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

【问题讨论】:

    标签: linux shell unix whitespace xargs


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      POSIX 标准mandates

      -L号码

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

      -n号码

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2017-05-28
          • 2012-07-25
          • 2012-02-04
          • 2018-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-12
          • 2016-12-13
          相关资源
          最近更新 更多