ls -l如何整齐地格式化其输出?


19

如何ls -l格式化其输出以使列内容整齐排列?

终奌站

Answers:


34

的源代码ls可在GNU Savannah上在线浏览。在大多数情况下,将计算所需的最大宽度(例如,使用mbswidth文本函数),然后使用经典的C printf函数格式说明符和一些手动填充。例如,参见函数format_user_or_group()gobble_file()

TL; DR:没有“魔术”,只有很多笨拙的计算。


如果您想要此类整洁的表作为自己的输出,请使用column

$ grep -vE '^#' /etc/fstab
UUID=cdff3742-9d03-4bc1-93e3-ae50708474f2 /               ext4    errors=remount-ro 0       1
/dev/mapper/lvmg-homelvm /home           btrfs   defaults,compress=lzo,space_cache,relatime 0       2
UUID="bb76cd0d-ae1d-4490-85da-1560c32679cd" none    swap sw 0 0
UUID="a264b1b1-cf82-40aa-ab9e-a810cfba169a" /home/muru/arch     btrfs defaults,compress=lzo,space_cache,relatime 0       2

$ grep -vE '^#' /etc/fstab | column -t
UUID=cdff3742-9d03-4bc1-93e3-ae50708474f2    /                ext4   errors=remount-ro                           0  1
/dev/mapper/lvmg-homelvm                     /home            btrfs  defaults,compress=lzo,space_cache,relatime  0  2
UUID="bb76cd0d-ae1d-4490-85da-1560c32679cd"  none             swap   sw                                          0  0
UUID="a264b1b1-cf82-40aa-ab9e-a810cfba169a"  /home/muru/arch  btrfs  defaults,compress=lzo,space_cache,relatime  0  2

4
假设您以/ etc / fstab为例,我不禁建议findmnt --fstab。所述UTIL Linux的包甚至带有一个图书馆“libsmartcols”(先前libtt)它使用在findmnt,lsblk等打印对准表。
grawity

@grawity很好。我以前用过findmnt,但我从未意识到它也可以做到这一点。
大师

还要知道的一点:在Ubuntu / debian上/bin/ls是软件包(GNU)的一部分coreutils。您可以通过运行找到它dpkg-query -S /bin/ls。知道软件包名称后,您可以使用apt-get source <package_name>
arielf 2013年

17

除了@muru的答案之外,这是源代码中用于计算 width输出正确性的部分。:

static void
format_user_or_group (char const *name, unsigned long int id, int width)
{
  size_t len;

  if (name)
    {
      int width_gap = width - mbswidth (name, 0);
      int pad = MAX (0, width_gap);
      fputs (name, stdout);
      len = strlen (name) + pad;

      do
        putchar (' ');
      while (pad--);
    }
  else
    {
      printf ("%*lu ", width, id);
      len = width;
    }

  dired_pos += len + 1;
}

它使用printf ("%*lu ", width, id);注意: 可变字段宽度说明符“ *”

在这种情况下,无法预测ls -l执行时我们将需要多大的字段宽度,即目录名称的长度可能会有所不同。这意味着字段宽度本身需要是一个变量程序将为此计算一个值

C 在字段宽度说明符的位置使用星号表示向printf表示它将找到包含字段宽度值作为附加参数的变量。

例如,假设width的当前值为5。该语句:

printf ("%*d%*d\n", width, 10, width, 11);

将打印:(注意间距)

   10   11

width是我提到的其他函数scontext_width,由计算得出。gooble_file
大师
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.