कमांड 'ls' के साथ फ़ाइलों और निर्देशिकाओं को एन्यूमरेट करें


11

lsवर्तमान निर्देशिका पर कमांड चलाएँ और आउटपुट प्राप्त करें:

$ ls
Applications Documents    Library      Music        Public
Desktop      Downloads    Movies       Pictures

मैं उन्हें पसंद करना चाहता हूं:

1. Applications
2. Desktop
3. Documents
4. Downloads
5. Library
6. Movies
7. Music
8. Pictures
9. Public

यह lessएक मध्यवर्ती तरीके से उपयोग करके प्राप्त किया जा सकता है

ls | less -N

सीधे तरीके से उन्हें कैसे घेरना है?


क्या आप चाहते हैं कि यह हमेशा हो, या कभी-कभी हो? पहले मामले में, आप उत्तर में आदेशों में से एक के लिए एलएस का उपनाम बना सकते हैं; दूसरे में, एक नया उपनाम बनाएं - कमांड को "lsn" कहें।
jamesqf

जवाबों:


16

या बस करो:

ls -b |nl -s '. ' -w 1
1. a\ file\ with\ nonewline
2. a\ file\ with\nnewline
3. a\ file\ with\ space
4. afile

से man nl:

-s, --number-separator=STRING
              add STRING after (possible) line number
-w, --number-width=NUMBER
              use NUMBER columns for line numbers

13

आपको lsकिसी अन्य कमांड के आउटपुट को पाइप करना चाहिए । मेरे सुझाव का उपयोग करने के लिए है awkमें इस तरह :

$ ls -b --group-directories-first | awk '{print NR ". " $0}'
1. dir1
2. dir2
3. dir3
4. z-dir1
5. z-dir2
6. z-dir3
7. file1
8. file2
9. file3
10. file4
11. file5
12. file6
13. file7
14. file\nnewline
  • कृपया ध्यान दें कि फ़ाइल में इसके नाम file\nnewlineमें newline वर्ण \nहै जो विकल्प से बच गया है -b

  • विकल्प --group-directories-firstफ़ाइलों से पहले निर्देशिकाओं का उत्पादन करेगा।

लूप के लिए उपयोग करने का एक और संभव तरीका है (लेकिन इस मामले में निर्देशिकाओं को सूची में रखने के लिए अधिक कठिन हो जाएगा):

n=1; for i in *; do echo $((n++)). $i; done

11

यदि केवल एक संख्या दिखाना मामला है, तो आपके पास अपने less -Nरास्ते के साथ-साथ कई विकल्प हैं :

$ ls |cat -n
$ ls |nl

यदि आप अनुकूलित आउटपुट नंबरिंग चाहते हैं, तो मैं सुझाव दूंगा कि findआप जो भी प्रिंट करना चाहते हैं उसका उपयोग करें और करें:

find . -exec bash -c 'for fnd; do printf "%d. %s\n" "$((++i))" "$fnd"; done ' _ {} +

POSIXly, आप करेंगे:

find . -exec sh -c 'for fnd; do i=$((i+1)); printf "%d.\t%s\n" "$i" "$fnd"; done ' _ {} +

इस मामले में, iपहले से शुरू होना चाहिए:i=0; find ...
rexkogitans

यह जरूरी नहीं है कि यहां -exec sh -c '....' अलग-अलग शंख के नीचे चल रहा है।
α atsнιη

3

आप इसे पूरी तरह से संक्षिप्त बैश स्क्रिप्ट के साथ भी कर सकते हैं:

#!/bin/bash
set -eu
shopt -s nullglob

[ "$#" -eq 0 ] || cd -- "$1"
i=0
for f in *; do
    printf '%d. %s\n' "$((++i))" "${f//$'\n'/^N}"
done |
cat -vt

तुम भी फैंसी हो सकता है और 9 से अधिक परिणामों के लिए लाइन नंबर पैड कर सकते हैं:

#!/bin/bash
set -eu
shopt -s nullglob

[ "$#" -eq 0 ] || cd -- "$1"
ls=(*)
pad=${#ls[@]}
pad=${#pad}
i=0
for f in *; do
    printf '%*d. %s\n' "$pad" "$((++i))" "${f//$'\n'/^N}"
done |
cat -vt

प्रयोग

यह मानते हुए कि आपने numbered-ls.shवर्तमान कार्यशील निर्देशिका में स्क्रिप्ट को एक निष्पादन योग्य फ़ाइल के रूप में सहेजा है :

./numbered-ls.sh [DIRECTORY]

तर्क DIRECTORYवैकल्पिक है और वर्तमान कार्यशील निर्देशिका में चूक है।

व्याख्या

  1. यदि स्क्रिप्ट को एक तर्क के साथ लागू किया गया था तो पहले तर्क में कार्यशील निर्देशिका को पथ में बदल दें।

  2. वर्तमान कार्यशील निर्देशिका की सभी प्रविष्टियों का मिलान करें और उन्हें देखें। प्रत्येक प्रविष्टि के लिए एक काउंटर बढ़ाता है और प्रविष्टि के नाम के साथ उसका मूल्य प्रिंट करता है। प्रविष्टि के नाम पर लाइन ब्रेक पात्रों को बदल दिया जाता है ^N

  3. cat -vtगैर-मुद्रण योग्य वर्णों वाले फ़ाइल नामों के साथ आउटपुट को पाइप के माध्यम से सुंदर तरीके से निपटने के लिए, जिसे टर्मिनल नियंत्रण वर्णों के रूप में व्याख्या कर सकता है।

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