ls -l çıkışı nasıl düzgünce biçimlendiriyor?

19

ls -l çıkışını nasıl biçimlendiriyor? Böylece sütun içeriği düzgün bir şekilde sıralanıyor mu?

    
sordu DK Bose 06.06.2016 19:22

2 cevap

34

adresinde çevrimiçi gezinmek için ls kaynak kodu kullanılabilir GNU Savannah . Çoğu durumda, gerekli maksimum genişlik hesaplanır (örneğin, metin için mbswidth işlevi kullanılarak) ve daha sonra klasik C printf işlev biçimi belirticileri ve bazı manuel dolgu kullanılır. Örneğin, format_user_or_group() işlevlerine bakın ve gobble_file() .

TP; DR: "sihir" yok, sadece çok fazla hesap var.

Kendi çıktılarınız için bu tür düzgün tablolar istiyorsanız, column kullanın:

$ 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
    
verilen cevap muru 06.06.2016 19:49
17

Muru’nun yanıtına ek olarak, burada kaynak kodu . :

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;
}

kullanır, printf ("%*lu ", width, id); . NOT: değişken alan genişliği belirteci ‘*’

Bu durumda, ls -l yürütüldüğünde, bir alan genişliğinin ne kadar büyük olacağı tahmin edilemez, yani, dizin adları uzunluk olarak değişebilir. Bu, alan genişliğinin kendisinin programın bir değer hesaplaması için değişken olması gerektiğini belirtir.

C, alan genişliğinin belirtecini, ek bir parametre olarak alan genişliğini içeren değişkeni bulacağını belirtmek için alan genişliği belirtecinin bulunduğu konumda yıldız işareti kullanır.

Örneğin, genişliğin geçerli değerinin 5 olduğunu varsayalım. Deyim:

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

yazdıracak: (boşluk bırak)

   10   11
    
verilen cevap Severus Tux 13.04.2017 14:25

Etiketlerdeki diğer soruları oku