Ls -l इसका आउटपुट इतने बड़े करीने से कैसे तैयार करता है?


19

ls -lइसके आउटपुट को प्रारूपित कैसे किया जाता है ताकि स्तंभ सामग्री बड़े करीने से पंक्तिबद्ध हो?

टर्मिनल

जवाबों:


34

स्रोत कोड GNU सवानाls पर ऑनलाइन ब्राउज़िंग के लिए उपलब्ध है । ज्यादातर मामलों में, आवश्यक अधिकतम चौड़ाई की गणना की जाती है (उदाहरण के लिए, पाठ के लिए फ़ंक्शन का उपयोग करना ), और फिर क्लासिक सी फ़ंक्शन प्रारूप विनिर्देशक और कुछ मैनुअल पैडिंग का उपयोग करता है । उदाहरण के लिए, फ़ंक्शंस और देखें ।mbswidthprintfformat_user_or_group()gobble_file()

टी एल; 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। उपयोग - लिनेक्स पैकेज यहां तक ​​कि एक पुस्तकालय "libsmartcols" (पहले से libtt) के साथ आता है जो इसे एक संरेखित तालिका को प्रिंट करने के लिए findmnt, lsblk, आदि में उपयोग करता है।
ग्रेविटी

@ अच्छाई मैंने findmntपहले भी इस्तेमाल किया था, लेकिन मुझे कभी नहीं लगा कि यह ऐसा भी कर सकता है।
मोरू

यह भी जानना अच्छा है: उबंटू / डेबियन /bin/lsपैकेज (जीएनयू) का हिस्सा है coreutils। आप इसे चलाकर पा सकते हैं dpkg-query -S /bin/ls। एक बार जब आप पैकेज का नाम जान लेते हैं, तो आप कोई भी उबंटू पैकेज सटीक स्रोत कोड डाउनलोड कर सकते हैं जिसमें से बाइनरी बनाया गया है (यह महत्वपूर्ण है) का उपयोग करके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 क्षेत्र चौड़ाई की स्थिति में तारांकन चिह्न का उपयोग करता है जो प्रिंटफ को इंगित करता है कि यह वह चर पाएगा जिसमें एक अतिरिक्त पैरामीटर के रूप में फ़ील्ड चौड़ाई का मान है।

उदाहरण के लिए, मान लें कि चौड़ाई का वर्तमान मान 5. कथन है:

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

प्रिंट होगा: (रिक्ति पर ध्यान दें)

   10   11

widthयहाँ है scontext_width, द्वारा गणना gooble_file, अन्य समारोह मैं उल्लेख किया है।
मुरु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.