एलएस -एल में केवल फ़ाइल नाम (रिक्त स्थान के साथ) कैसे आउटपुट करें?


78

मुझे इस निर्माण के साथ केवल फाइलों या निर्देशिकाओं के नाम गूँजने चाहिए:

ls -Al | while read string
do
...
done

ls -Al आउटपुट:

drwxr-xr-x  12 s162103  studs         12 march 28 12:49 personal domain
drwxr-xr-x   2 s162103  studs          3 march 28 22:32 public_html
drwxr-xr-x   7 s162103  studs          8 march 28 13:59 WebApplication1

उदाहरण के लिए अगर मैं कोशिश करूँ:

ls -Al | while read string
do
echo "$string" | awk '{print $9}
done

तो केवल रिक्त स्थान के बिना फ़ाइलों और निर्देशिकाओं का उत्पादन। यदि फ़ाइल या निर्देशिका में "व्यक्तिगत डोमेन" जैसे स्थान हैं, तो यह केवल "व्यक्तिगत" शब्द होगा।

मुझे बहुत सरल समाधान की आवश्यकता है। शायद जाग से बेहतर उपाय है।


2
सिर्फ क्यों नहीं ls -Al *' '*? पार्सिंग lsका आउटपुट कभी भी कुछ भी अच्छा नहीं होता है।
manatwork

1
यदि आपको किसी ऐसी चीज़ की ज़रूरत है जो किसी भी * निक्स में काम आएगी तो उपयोग करने से बचें ls -Al | while। एक सरल और अधिक विश्वसनीय तरीका है for string in *; do echo "$string"; done
Forcefsck

केवल इस निर्माण के साथ की जरूरत है..आज, सरल नहीं, कोई समाधान!
एलेक्स ज़र्न

1
आपको आवश्यकता क्यों है ls? पार्सिंग lsऔर "सभी * निक्स में काम करते हैं और अगर कुछ हुआ तो नहीं टूटेगा" एक साथ अच्छी तरह से न चलें।
terdon

जवाबों:


97

आपको वास्तव में आउटपुट को पार्स नहीं करना चाहिएls । यदि यह एक होमवर्क असाइनमेंट है और आपको इसकी आवश्यकता है, तो आपके प्रोफेसर को यह नहीं पता होता है कि वे किस बारे में बात कर रहे हैं। आप ऐसा कुछ क्यों नहीं करते हैं:

अच्छा...

find ./  -printf "%f\n"

या

for n in *; do printf '%s\n' "$n"; done

...खराब...

यदि आप वास्तव में उपयोग करना चाहते हैं ls, तो आप इस तरह से कुछ करके इसे और अधिक मजबूत बना सकते हैं:

ls -lA | awk -F':[0-9]* ' '/:/{print $2}'

... और बदसूरत

यदि आप इसे गलत, खतरनाक तरीके से करने पर जोर देते हैं और बस एक whileलूप का उपयोग करना है, तो यह करें:

ls -Al | while IFS= read -r string; do echo "$string" | 
    awk -F':[0-9]* ' '/:/{print $2}'; done

गंभीरता से, हालांकि, बस नहीं।


drwx------ 2 s162103 studs 3 oct. 9 2012 .ssh drwxr-xr-x 3 s162103 studs 6 oct. 25 09:02 .subversion drwxrwxrwt 3 s162103 studs 3 nov. 15 2012 .TempoItemsकभी-कभी मुझे समय के बिना तारीख
मिलती है

1
@AlexZern खैर, यह उन कारणों में से एक है जो आप के उत्पादन को पार्स नहीं करते हैं ls
terdon

2
@AlexZern आपको -lवैसे भी स्विच की आवश्यकता क्यों है ? यदि आप चाहते हैं कि सभी फ़ाइल नाम हैं, तो बस चलाएं ls -A। उपयोग करना -lआपके जीवन को कठिन बनाता है क्योंकि अब आपको आउटपुट को पार्स करना है।
terdon

क्योंकि मुझे अभिगमन, तिथि, स्वामी आदि जैसी अतिरिक्त जानकारी की आवश्यकता है। और मैंने एक विशाल स्क्रिप्ट लिखी, जो अच्छी तरह से काम करती है, सिवाय प्रिंट फ़ाइल और रिक्त स्थान वाले डायर नामों के।
एलेक्स ज़र्न

3
ठीक है फिर। हमारे यहाँ क्या है एक XY समस्या हैlsसिर्फ वही नहीं है जो आपको चाहिए। आप एक नया प्रश्न क्यों पोस्ट नहीं करते हैं, जो जानकारी आप एकत्र करना चाहते हैं और हम इसे करने के तरीके सुझा सकते हैं। वैकल्पिक रूप से, आप अपनी स्क्रिप्ट का उपयोग कर सकते हैं, और ऊपर दिए गए सुझावों में से केवल एक नाम का उपयोग कर सकते हैं। लेकिन गंभीरता से, पार्स न करें ls, बस हमें बताएं कि आप एक नए प्रश्न में क्या करने की कोशिश कर रहे हैं।
terdon

74

वहाँ कुछ कारण है कि ls -A1* काम नहीं करेगा?

उदाहरण के लिए:

$ touch file1 file2 file\ with\ spaces
$ ls -Al
total 0
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file1
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file2
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file with spaces
$ ls -A1
file1
file2
file with spaces
$

* नोट: यह एक कैपिटल लेटर A और नंबर एक है।


4
-1 प्रतिभाशाली है। मुझे नहीं पता था कि उपलब्ध था। (मुझे पता है मुझे पता है। RTFM)
आलसी कोडर

यह केवल वर्तमान निर्देशिका के लिए काम करता है यदि आप अन्य निर्देशिकाओं से फ़ाइल नाम सूचीबद्ध करना चाहते हैं ~ / प्रोजेक्ट्स तो आपको फ़ाइल नामों के बजाय पूर्ण पथ
मिलेंगे

@ मैक 10.9.5 पर यह सिर्फ फ़ाइल नामों को सूचीबद्ध करता है। आप कौन सा ओएस उपयोग कर रहे हैं?
AJP

मैं यह ls ~ / प्रोजेक्ट्स / * चला रहा हूं। ls के लिए उदात्त-प्रोजेक्ट -१ ~ ~ प्रोजेक्ट्स -१ -१ मुझे केवल नाम मिलते हैं
thecotne

3
@ TheLazyCoder से मैनुअल पढ़ने की उम्मीद नहीं की जाएगी।
c24w

41

मुझे आश्चर्य है कि किसी ने इस सरल आदेश का उल्लेख क्यों नहीं किया:

ls -a | sort

2
प्रतिभाशाली! sortबहु-स्तंभ ब्लॉक को एकल स्तंभ में अनप्लॉट करने के लिए पाइपिंग के कारण कोई भी विचार ?
msciwoj

@msciwoj यह सिर्फ व्हाट्सएप द्वारा अलग किए गए किसी भी तार को लेता है और उन्हें एंडलाइन द्वारा अलग किए गए प्रिंट करता है
बेन

उत्तम! यह असली जवाब के रूप में चिह्नित क्यों नहीं था !?
02 劇場

3
यह यहां काम करता है क्योंकि lsreverts को ls -1(और प्रिंट न हो सकने चरित्र के हवाले / प्रतिस्थापन अक्षम कर देता है; @Kusalananda, अपने (एकल columnd उत्पादन) इसके उत्पादन एक टर्मिनल के लिए जाना नहीं है जब lsशिकायत POSIX नहीं है, तो यह अभी भी करता है)। lsआउटपुट पहले से ही सॉर्ट किया गया है। तो यह करने के लिए sortसबसे अच्छा कुछ भी नहीं करने के लिए पाइपिंग , और इससे भी बदतर उत्पादन (यदि फ़ाइल नाम में नए अक्षर होते हैं) या फ़ाइल नाम के लिए असफल नहीं हैं। ls -a | catबेहतर होगा। या इससे भी बेहतर ls -A1जैसा कि पहले ही उल्लेख किया गया है (और क्योंकि आप आम तौर पर टर्मिनल पर प्रदर्शित होने पर प्रतिस्थापन / उद्धरण चाहते हैं)
स्टीफन चेज़लस

1
@ स्टीफनचेज़ेलस नोटेड। lsजब उत्पादन एक टर्मिनल नहीं है तो अलग तरह से व्यवहार करता है।
Kusalananda

3

आप के आउटपुट को पार्स नहीं कर सकते हैं ls, अकेले जाने दें ls -lक्योंकि न्यूलाइन, जैसे स्पेस वैसा ही है जैसा कि किसी फाइलनाम में किसी कैरेक्टर के बराबर है। इसके अलावा, आपको उन सबलिंक पर विचार करने की आवश्यकता होगी जिनके पास आउटपुट है ... foo -> bar

-lयदि आप केवल फ़ाइल नाम चाहते हैं तो आप इसका उपयोग क्यों करेंगे ?

बस करो:

for file in *; do
  ...
done

यदि आप शेल के अलावा डॉट फाइलें (छोड़कर .और ..) शामिल करना चाहते हैं :

zsh:

for file in *(ND); do
  ...
done

bash:

shopt -s nullglob dotglob
for file in *; do
  ...
done

ksh93:

FIGNORE='@(.|..)'
for file in ~(N)*; do
  ...
done

POSIXly:

for file in .[!.]* ..?* *; do
  [ -e "$file" ] || [ -L "$file" ] || continue
  ...
done


1
ls -Al | tr -s ' ' | cut -f9- -d' '

tr के साथ एकल स्थानों में कई स्थानों को संपीड़ित करें फिर आप कट को खेतों में विभाजित करने के लिए उपयोग कर सकते हैं


1

(प्रयास करें bash, zsh, ksh93वाक्य रचना):

find . -type f -print0 | while IFS= read -r -d '' filename; do
  ...
done

यह पुनरावर्ती जाता है और केवल सामान्य फ़ाइलों (यानी कोई dirs या सिम्लिंक / फ़िरोज़ / डिवाइस ...) पर सूचीबद्ध नहीं होता है।

यह सभी देखें:



-1
ls --file *|grep ^ 

यह प्रदर्शित करता है कि किस निर्देशिका के तहत कौन सी फाइलें हैं।


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