ls -l จัดรูปแบบเอาต์พุตอย่างไรอย่างประณีต?


คำตอบ:


34

รหัสที่มาของlsใช้ได้สำหรับการเรียกดูออนไลน์บนGNU สะวันนา ในกรณีส่วนใหญ่ความกว้างสูงสุดที่ต้องการจะถูกคำนวณ (ตัวอย่างเช่นการใช้mbswidthฟังก์ชั่นสำหรับข้อความ) จากนั้นใช้ตัวprintfระบุรูปแบบฟังก์ชันคลาสสิก C และการขยายด้วยตนเองบางส่วน ดูตัวอย่างเช่นฟังก์ชั่นและformat_user_or_group()gobble_file()

TL; แดนรีเวอร์ส: ไม่มี "เวทมนต์" แค่การคำนวณที่น่ากลัว


หากคุณต้องการตารางที่เรียบร้อยสำหรับการแสดงผลของคุณเองให้ใช้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 ลินุกซ์แพคเกจยังมาพร้อมกับห้องสมุด "libsmartcols" (ก่อนหน้านี้ libtt) ซึ่งจะใช้ใน findmnt, lsblk ฯลฯ ในการพิมพ์ตารางชิด
grawity

@grawity ดี ฉันเคยใช้มาfindmntก่อน แต่ฉันไม่เคยรู้มาก่อนว่าจะสามารถทำได้เช่นกัน
muru

ยังดีที่จะรู้: บน Ubuntu / เดเบียน/bin/lsเป็นส่วนหนึ่งของแพคเกจ coreutils(GNU) dpkg-query -S /bin/lsคุณสามารถค้นหานี้โดยการเรียกใช้ เมื่อคุณรู้ว่าชื่อแพคเกจคุณสามารถดาวน์โหลดใด ๆแพคเกจ Ubuntu รหัสที่มาที่แน่นอนจากการที่ไบนารีที่สร้างขึ้น (นี้เป็นสิ่งสำคัญ) โดยใช้apt-get source <package_name>
arielf

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 ซึ่งจะค้นหาตัวแปรที่มีค่าของความกว้างของฟิลด์เป็นพารามิเตอร์เพิ่มเติม

ตัวอย่างเช่นสมมติว่ามูลค่าปัจจุบันของความกว้างคือ 5 คำสั่ง:

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

จะพิมพ์: (สังเกตระยะห่าง)

   10   11

widthนี่scontext_widthซึ่งคำนวณโดยgooble_fileที่คนอื่น ๆฟังก์ชั่นที่ผมกล่าวถึง
muru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.