मैं `ls -l` के आउटपुट से फ़ील्ड / कॉलम कैसे चुनूं?


22

मेरा लक्ष्य भ्रामक रूप से सरल है (कम से कम मेरे लिए)। मैं ls -lया तो आउटपुट लेना चाहता हूं ls -lhऔर सिर्फ एक फील्ड का चयन करना चाहता हूं ।

मैं इसे यथासंभव बुलेटप्रूफ होने के लिए देख रहा हूं, जिससे मेरा मतलब है, मान लें कि फ़ाइल नाम में रिक्त स्थान की एक चर संख्या हो सकती है, न कि क्षेत्र में सब कुछ समान लंबाई, आदि।

एक स्क्रिप्ट होने के लिए बोनस अंक जो फ़ील्ड का नाम लेगा (या यहां तक ​​कि सिर्फ एक फ़ील्ड नंबर), और फिर फ़ील्ड की सामग्री वापस कर देगा।

मैं मुड़ना चाहता हूं

यहां छवि विवरण दर्ज करें

में:

यहां छवि विवरण दर्ज करें

जवाबों:


41

कोशिश करो ls -l | awk '{print $7}'

awk कॉलम का चयन करता है इसलिए यह इस कार्य के लिए एकदम सही है।


3
जैसा कि @ormaaj द्वारा समझाया गया है: विशिष्ट स्थानों पर उपलब्ध जानकारी के टुकड़ों पर भरोसा न करें lsfindआदेश काफी उपयोगी है।
धान लैंडौ

@PaddyLandau मैं मेगाबाइट में फाइल साइज़ को प्रिंट करने के लिए मैं कैसे कमांड कमांड का उपयोग कर सकता हूं जैसे मैं कर सकता हूं ls -l --block-size=M?
सरप्राइजडॉग

@ बैंजामिन - lsकमांड POSIX मानक नहीं है, इसलिए एक स्क्रिप्ट जो निर्भर करती है lsवह विभिन्न प्रणालियों या समय के साथ भी टूट सकती है। अधिक विवरण के लिए इस पृष्ठ पर @ormaaj द्वारा उत्तर देखें। बैश लूप के साथ जो आप पूछते हैं उसे करने का एक तरीका है। यहाँ एक उदाहरण है। for FILENAME in *; do FILESIZE=$(( $( stat --format=%s "${FILENAME}" ) / 1024 )); echo "${FILENAME}" ${FILESIZE}; done। बेशक, इसके बजाय echo, आप अपने प्रसंस्करण का उपयोग करेंगे।
धान लैंडौ

@PaddyLandau मैंने अभी-अभी खोज कमांड के आउटपुट को समाप्त किया है, ... | xargs -d '\n' du -mजो काम करता है।
सरप्राइजडॉग

@Benjamin आप के -execविकल्प को देखना चाह सकते हैं find
धान लैंडौ

17

कभी पार्स ls । GNU का प्रयोग करें find। या यदि पोर्टेबिलिटी महत्वपूर्ण नहीं है, stat(1)

find . -maxdepth 1 -printf '%Td\n'

फिल्म्स लाइन-बाय-लाइन की सूची के अलावा अन्य डेटा पढ़ने और खेतों में विभाजन के लिए, देखें: BashFAQ / 001

किसी भी नाम-पत्र की नई-सीमांकित सूची को मज़बूती से पढ़ने की कोई विधि नहीं है जो अधिकांश परिस्थितियों में समझ में आता है।


1

आप शेल में विशिष्ट कॉलम ला सकते हैं जैसे:

ls -al | while read perm bsize user group size month day time file; do echo $day; done

या awkजैसा कि @ उत्तर में दिखाया गया है , cut -c44-45समायोजन के बाद भी काम करेगा (क्योंकि lsनिश्चित कॉलम है), या जो भी हो, लेकिन मुख्य समस्या यह है कि यह विश्वसनीय और बुलेटप्रूफ नहीं होगा (जैसे यूनिक्स पर यह हो सकता है $6, नहीं $7, और यह तर्कों के आधार पर परिवर्तन) इसे मशीन के अनुकूल नहीं बनाता है इसलिए इसे lsकमांड को पार्स करने की अनुशंसा नहीं की जाती है

सबसे अच्छा है विभिन्न उपलब्ध कमांड का उपयोग करना जैसे कि findया stat, जो आउटपुट को स्वरूपित करने के लिए प्रासंगिक विकल्प प्रदान कर सकता है जैसे आपको चाहिए। उदाहरण के लिए:

$ stat -c "%x %n" *
2016-04-10 04:53:07.000000000 +0100 001.txt
2016-04-10 05:08:42.000000000 +0100 7c1c.txt

संशोधनों के केवल दिनों के कॉलम को वापस करने के लिए, इस उदाहरण का प्रयास करें:

stat -c "%x" * | while read ymd; do date --date="$ymd" "+%d"; done

यह ध्यान देने योग्य है कि GNU में statBSD के लिए अलग-अलग विकल्प हो सकते हैं stat, इसलिए यह अभी भी विभिन्न ऑपरेटिंग सिस्टम में बुलेटप्रूफ नहीं होगा।


1
+1 का उल्लेख है कि ls को पार्स नहीं किया जाना चाहिए और साथ ही उपयोग के लिए भी statdateहालाँकि सेटअप गलत है। आपको जोड़ना चाहिए --date=$ymd, क्योंकि dateस्वयं वर्तमान दिन प्रिंट करेगा, लेकिन यहां उद्देश्य फ़ाइल के दिनांक प्रारूप को परिवर्तित करना है
सर्गी कोलोडियाज़नी

ls -la | cut -c32-33कुल ईमानदारी में आदेश सिर्फ पूरी तरह से अविश्वसनीय, न केवल फ़ाइल नामों के साथ संभव नुकसान की वजह से है, लेकिन क्योंकि यह उपयोगकर्ता नाम 'की लंबाई और फाइलों पर' पर आकार निर्भर करता है। यह stat -c "%x" *.*आदेश ठीक लग रहा है, लेकिन *.*आप इसका उपयोग केवल डॉट वाले फ़ाइलनाम पर रोक रहे हैं। मुझे लगता है कि इरादा भी छिपी हुई फाइलों को पकड़ने का था; उस मामले में आप पहले से dotfiles के लिए ग्लोबिंग सक्षम और का उपयोग करना चाहिए *के बजाय *.*: shopt -s dotglob; stat -c "%x" * | [...]
कोस

आह और क्या Serg ने यह भी कहा, आप जोड़ना चाहिए --date="$ymd"करने के लिए dateआदेश, अन्यथा यह महीने की वर्तमान दिन प्रिंट होगा।
कोस

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