मैं ls कमांड से आउटपुट के सिर्फ 1 कॉलम को कैसे गूँजता हूँ?


54

Ls का कहना है कि जब मैं करता हूँ ls कमांड आउटपुट है:

file1 file2 file3 file4

क्या इस केस फ़ाइल 2 में केवल आउटपुट का एक निश्चित कॉलम प्रदर्शित करना संभव है? मैंने बिना किसी सफलता के साथ कोशिश की है:

echo ls | $2

मूल रूप से मैं जो करना चाहता हूं, वह केवल दूसरे कॉलम को प्रतिध्वनित करता है, इस मामले में, मैं प्रतिध्वनि करना चाहता हूं:

file2

2
ऐसी स्थिति क्या है जिसमें आप वास्तव में आउटपुट का कॉलम चाहते हैं ls?
माइकल

11
एक सामान्य नियम के रूप में, आपको कभी भी ls पार्स नहीं करना चाहिए । आपके द्वारा आवश्यक जानकारी प्राप्त करने के लगभग हमेशा बेहतर तरीके हैं।
terdon

पी (खेद है कि मैं allways वाक्यांश पसंद आया) स्तंभों की संख्या नाम फ़ाइलों पर निर्भर करते हैं और फ़ोल्डरों, है तो 2 कॉलम आप जो चाहते है, हो सकता है या नहीं हो सकता है, या एक में हो सकता है: मुझे लगता है कि अजनबी नहीं करेंगे lsऔर कुछ फ़ाइलों / फ़ोल्डरों को बनाने के बाद अब वह नहीं हो सकता है जो आप चाहते हैं। जैसे ही टेर्डन ने बताया कि आप जो चाहते हैं उसे पाने के लिए बेहतर तरीके हैं
योमोइस्मो

जवाबों:


81

निम्न कमांड एक कॉलम में ls आउटपुट को फॉर्मेट करेगा

ls -1 /directory

2
लेकिन यह आपको केवल एक कॉलम नहीं देता है जिसमें ओपी रुचि रखता है।
एंथन

1
इसे सही करने के लिए: ls -1 /directory | head -2 | tail -1याls -1 /directory | perl -ne 'print if $. == 2'
KWubbufetowicz

@KWbbufetowicz ls | sed -n '1p;q'सरल लगती है
फिक्सिमैन

3
जवाब मैं देख रहा था, लेकिन ओपी के सवाल के लिए नहीं।
माइकल लैंग

36

आप इसके लिए देख रहे हैं:

ls -C | awk '{ print $2 }'

हालाँकि, आप बाद में इस फ़ाइल नाम का उपयोग करने का प्रयास करने जा रहे हैं, ऐसा न करें, क्योंकि यह व्हॉट्सएप वाले फ़ाइल नाम पर टूट जाएगा। इसके बजाय, फ़ाइलों को एक सरणी में रखें, और दूसरा प्राप्त करें, जो किसी भी पार्सिंग को करने से बचता है:

files=(*)
printf '%s\n' "${files[1]}"

आप फ़ाइलों को वापस पाने के क्रम में के मूल्य पर निर्भर करता है LC_COLLATE। जैसे, आप LC_COLLATE=Cपहले सेट करना चाह सकते हैं , यदि आप सभी कोने के मामलों में "मानक" छांटना चाहते हैं।


ध्यान दें कि सरणी सूचक 1समझदार गोले (zsh, yash, fish, csh, tsh, rc, es ...) और 0ksh और bash में शुरू होते हैं। सभी बॉर्न जैसे गोले के पोर्टेबल समाधान के लिए, आप इसका उपयोग कर सकते हैं: set -- *; printf '%s\n' "$2"इसके बजाय।
स्टीफन चेज़लस

@ StéphaneChazelas कम से कम इस प्रश्न के लिए, टैग में "बैश" शामिल है, इसलिए यह उत्तर उस शेल के लिए विशिष्ट है।
क्रिस डाउन

ls -C | awk '{प्रिंट $ 1} समान आउटपुट देता है ... $ 2 क्यों?
बोक्टुलस

7

आप को जोड़ने के लिए की आवश्यकता होगी -Cके रूप में lsजब उत्पादन एक टर्मिनल नहीं है एकल-स्तंभ मोड का उपयोग करता। awkफिर दूसरे कॉलम को प्रिंट करता है:

ls -C | awk '{print $2}'

2

मुझे लगता है कि आप ढूंढ रहे हैं

ls -1

यह अनुमति नहीं दिखाएगा, स्वामी, समूह, दिनांक, आकार ... लेकिन एकल कॉलम में सरल फ़ाइल नाम।


1
न केवल यह उत्तर गलत है, बल्कि पहले भी दिया जा चुका है।
स्कॉट

हालांकि मुझे एहसास है कि यह मूल प्रश्न के लिए गलत है, यह वही है जो मैं देख रहा था। इसलिए तुम्हे धन्यवाद।
एंटुमडेल्यूज


0

जैसा कि पहले ही उल्लेख किया गया है - पार्सिंग lsआउटपुट के लिए कॉलम का उपयोग करना बहुत मजबूत नहीं है क्योंकि lsआपकी फ़ाइल नाम की लंबाई और टर्मिनल चौड़ाई के अनुसार लाइनें टूट जाती हैं। यह अक्सर दिलचस्प होता है, हालांकि तत्वों की सूची के एकल स्तंभ को प्रदर्शित करने के लिए। आप कट कमांड का उपयोग करके ऐसा कर सकते हैं:

echo file1 file2 file3 file4 | cut -d" "  -f2

प्रदर्शित करेगा

file2

ध्यान दें कि -dआप कॉलम सीमांकक का चयन कर सकते हैं, उदाहरण के लिए

cur -d, -f2

आप अल्पविराम से अलग की गई सूची का दूसरा स्तंभ प्रदर्शित कर सकते हैं।


0

मान लीजिए कि यदि आप कमांड के नीचे वर्तमान पथ उपयोग के तहत केवल विशेष फ़ाइल नाम को प्रदर्शित करना चाहते हैं

आदेश:

find path -maxdepth 1 -iname "filename"|sed "s/\.\///g"

0

यह मुश्किल है, क्योंकि पार्सिंग ls -Cइस पर निर्भर करता है:

  1. फ़ाइल नाम की लंबाई, (जो स्वयं निर्दिष्ट की गई फ़ाइल सूची पर निर्भर करती है ls -C)
  2. टर्मिनल की चौड़ाई।
  3. तथ्य यह है कि ls -Cआउटपुट स्तंभ है, लेकिन फ़ील्ड विभाजकों के रूप में रिक्त स्थान की संख्या को कॉन्फ़िगर किया जा सकता है।
  4. फ़ाइल नाम में व्हॉट्सएप की संभावना, (जिनमें से lsप्रदर्शन चुने गए विशेष प्रदर्शन विकल्पों पर निर्भर करता है )।

अभी के लिए, आइए आसान समस्या के साथ शुरू करें, ( अर्थात # 4 ऊपर नहीं), यह मानते हुए कि फ़ाइल नाम में कोई व्हाट्सएप नहीं है । कॉलम # 2 प्रिंट करने के लिए, यह काम करता है:

COLUMNS=$COLUMNS ls -C | tr -s ' ' '\t' | cut -f2

उस पर नियंत्रण:

  • COLUMNS=$COLUMNSयह गारंटी देता है कि कॉलम की लंबाई | वर्तमान टर्मिनल डिस्प्ले के अनुरूप बनी रहेगी। एक मनमाना मूल्य के लिए इस को बदलना भी काम करता है, तो COLUMNS=50या COLUMNS=70 कारण होगा ls -Cउन चौड़ाई के अनुसार चीजों को पुनर्व्यवस्थित करने के लिए।

    -wस्विच का उपयोग करने के लिए एक और तरीका होगा , जैसे :

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
  • trफ़ील्ड विभाजकों को सुसंगत बनाता है: प्रत्येक कॉलम के बीच एक एकल टैब

  • cut वांछित कॉलम आउटपुट।



-1
num_chars=54 # offset
ls -ltr | cut -c$num_chars-

वर्णों की संख्या (54) को आवश्यक रूप से बदलें ताकि आप केवल वह डेटा प्राप्त कर सकें जो आप चाहते हैं।


2
54-स्थिति 54 पर शुरू होने वाले हर चरित्र के लिए कटौती का उपयोग करके स्पष्ट करने के लिए; यह "मानव-मान्यता प्राप्त" कॉलम पर नहीं रुकती
जेफ स्कालर

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