Làm thế nào để ls -l định dạng đầu ra của nó rất gọn gàng?


19

Làm thế nào để ls -lđịnh dạng đầu ra của nó để nội dung cột thẳng hàng?

thiết bị đầu cuối

Câu trả lời:


34

Mã nguồn lscó sẵn để duyệt trực tuyến trên GNU Savannah . Trong hầu hết các trường hợp, độ rộng tối đa cần thiết được tính toán (ví dụ: sử dụng mbswidthhàm cho văn bản), sau đó sử dụng các printfchỉ định định dạng hàm C cổ điển và một số phần đệm thủ công. Xem, ví dụ, các chức năng format_user_or_group(), và gobble_file().

TL; DR: không có "phép thuật", chỉ có rất nhiều tính toán lẩm bẩm.


Nếu bạn muốn các bảng gọn gàng như vậy cho đầu ra của riêng bạn, hãy sử dụng 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
Cho rằng bạn đã sử dụng / etc / fstab làm ví dụ, tôi không thể không đề xuất findmnt --fstab. Các util-linux gói thậm chí đi kèm với một thư viện "libsmartcols" (trước đây libtt) mà nó sử dụng trong findmnt, lsblk, vv để in một bảng liên kết.
grawity

@grawity đẹp. Tôi đã từng sử dụng findmnttrước đây, nhưng tôi chưa bao giờ nhận ra nó cũng có thể làm điều này.
muru

Cũng cần biết: trên Ubuntu / debian /bin/lslà một phần của gói (GNU) coreutils. Bạn có thể tìm thấy điều này bằng cách chạy dpkg-query -S /bin/ls. Khi bạn biết tên gói, bạn có thể tải xuống bất kỳ mã nguồn chính xác của gói Ubuntu mà mã nhị phân được tạo (điều này rất quan trọng) bằng cách sử dụngapt-get source <package_name>
kể từ

17

Ngoài câu trả lời của @muru , đây là một phần của mã nguồn tính toán widthcho sự biện minh đúng của đầu ra. :

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

Nó sử dụng , printf ("%*lu ", width, id);. LƯU Ý: công cụ xác định độ rộng trường biến '*'

Trong trường hợp này, không thể dự đoán được độ rộng trường chúng ta sẽ cần khi ls -lđược thực thi, nghĩa là, Tên của các thư mục có thể khác nhau về chiều dài. Điều này ngụ ý rằng chính độ rộng trường cần phải là một biến , trong đó chương trình sẽ tính toán một giá trị .

C sử dụng dấu hoa thị ở vị trí của bộ xác định độ rộng trường để chỉ ra cho printf rằng nó sẽ tìm biến chứa giá trị của độ rộng trường làm tham số bổ sung.

Chẳng hạn, giả sử rằng giá trị hiện tại của chiều rộng là 5. Câu lệnh:

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

sẽ in: (lưu ý khoảng cách)

   10   11

Đây widthscontext_width, tính theo gooble_file, các chức năng khác tôi đã đề cập.
muru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.