Ls -l आउटपुट की प्रत्येक पंक्ति पर इरेटिंग


119

मैं इसके उत्पादन में प्रत्येक पंक्ति पर पुनरावृति करना चाहता हूं: ls -l /some/dir/*

अभी मैं कोशिश कर रहा हूँ: for x in $(ls -l $1); do echo $x; done

हालाँकि, यह पंक्ति में प्रत्येक तत्व पर अलग से पुनरावृत्ति करता है, इसलिए मुझे यह मिलता है:

-r--r-----
1
ivanevf
eng
1074
Apr
22
13:07
File1

-r--r-----
1
ivanevf
eng
1074
Apr
22
13:17
File2

लेकिन मैं एक पूरे के रूप में प्रत्येक पंक्ति पर पुनरावृति करना चाहता हूं, हालांकि। मैं उसको कैसे करू?


1
हमेशा चर (और कमांड आउटपुट) को उद्धृत करें जब तक कि आपके पास कोई विशिष्ट कारण न हो।
ग्लेन जैकमैन

जवाबों:


246

IFS को इस तरह सेट करें:

IFS='
'
for x in `ls -l $1`; do echo $x; done

यदि आप स्थायी रूप से IFS सेट नहीं करना चाहते हैं, तो इसके चारों ओर एक उप-शेल डालें:

(IFS='
'
for x in `ls -l $1`; do echo $x; done)

या उपयोग करते समय | इसके बजाय पढ़ें:

ls -l $1 | while read x; do echo $x; done

एक और विकल्प, जो समान शेल स्तर पर समय / समय पर चलता है:

while read x; do echo $x; done << EOF
$(ls -l $1)
EOF

12
पाइपिंग करते समय सावधान रहें, जबकि
उप-

1
$ 1 यहाँ क्या कर रहा है? मुझे इसे एक स्क्रिप्ट में उपयोग करने की आवश्यकता है जो मैं लिख रहा हूं जो तर्कों को स्वीकार करता है। $ 1 चीजों को फेंक रहा है। उसी प्रभाव को प्राप्त करने के लिए मैं $ 1 के बजाय वहाँ क्या रख सकता हूँ? मैं दूसरे समाधान का उपयोग करना चाहूंगा।
noob-in-need

@ noob-in-need इसे आप जिस भी डाइरेक्टरी में लिस्ट करना चाहते हैं उसे बदल दें
vpzomtrrfrt

1
आप करना चाह सकते हैं read -rया फिर डेटा से बैकस्लैश हटाकर बैश स्ट्रिप करेंगे।
ब्रायन गॉर्डन

6

यह निर्भर करता है कि आप प्रत्येक पंक्ति के साथ क्या करना चाहते हैं। इस प्रकार के प्रसंस्करण के लिए awk एक उपयोगी उपयोगिता है। उदाहरण:

 ls -l | awk '{print $9, $5}'

.. मेरे सिस्टम पर निर्देशिका में प्रत्येक आइटम का नाम और आकार प्रिंट करता है।


3

जैसा कि पहले ही उल्लेख किया गया है, awk इसके लिए सही उपकरण है। यदि आप लाइन द्वारा "ls -l" लाइन के आउटपुट को पार्स करने के बजाय awk का उपयोग नहीं करना चाहते हैं, तो आप सभी फ़ाइलों पर पुनरावृति कर सकते हैं और इस तरह से प्रत्येक व्यक्तिगत फ़ाइल के लिए "ls -l" कर सकते हैं:

for x in * ; do echo `ls -ld $x` ; done

3

आप findकमांड भी आज़मा सकते हैं । यदि आप केवल वर्तमान निर्देशिका में फ़ाइलें चाहते हैं:

find . -d 1 -prune -ls

उनमें से प्रत्येक पर एक कमांड चलाएं?

find . -d 1 -prune -exec echo {} \;

गणना लाइनों, लेकिन केवल फाइलों में?

find . -d 1 -prune -type f -exec wc -l {} \;


टूटा हुआ है। Ioften को कुछ विचित्र त्रुटि संदेश मिलते हैं। जब कमांडलाइन पूरी तरह से वैध हो, तो यह मुझे मदद देना चाहता है, और ऐसा लगता है कि एक बार ऐसा करने के बाद, यह अगले रिबूट तक बंद नहीं होगा। यह कभी-कभी त्रुटियों के संबंध में प्रकृति में यादृच्छिक लगता है। मुझे यकीन नहीं है कि मैं बग की रिपोर्ट कैसे कर सकता हूं।
जिम माइकल्स

1

एलएस (1) कमांड के आउटपुट रिडायरेक्शन के साथ रीड (1) उपयोगिता वही करेगी जो आप चाहते हैं।


-1

इसलिए, किसी ने भी उन विकल्पों का उपयोग करने का सुझाव क्यों नहीं दिया जो उन हिस्सों को खत्म करते हैं जिन्हें वह संसाधित नहीं करना चाहता है।

आधुनिक डेबियन पर आपको बस अपनी फ़ाइल मिलनी चाहिए:

ls --format=single-column 

इससे भी अधिक, आपको इस बात पर ध्यान देने की आवश्यकता नहीं है कि यदि आप पूर्ण निर्देशिका का उपयोग करते हैं तो आप इसे किस निर्देशिका में चला रहे हैं:

ls --format=single-column /root/dir/starting/point/to/target/dir/

यह अंतिम कमांड मैं ऊपर उपयोग कर रहा हूं और मुझे निम्न आउटपुट मिलता है:

bot@dev:~/downloaded/Daily# ls --format=single-column /home/bot/downloaded/Daily/*.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141119_IENT1.txt.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141120_IENT1.txt.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141121_IENT1.txt.gz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.