फ़ाइल नाम में दिए गए स्ट्रिंग से मेल नहीं खाती सूची फ़ाइलें


16

मेरे पास एक निर्देशिका है जिसमें नाम के साथ बहुत सारी फाइलें (लगभग 200) temp_log.$$कई अन्य महत्वपूर्ण फाइलों के साथ बनाई गई हैं, जिनकी मुझे जांच करने की आवश्यकता है।

मैं आसानी से सभी फाइलों को कैसे सूचीबद्ध कर सकता हूं और temp_log.$$फ़ाइलों को प्रदर्शित होने से बाहर कर सकता हूं ?

अपेक्षित उत्पादन

$ ls -lrt <exclude-filename-part>
-- Lists files not matching the above given string

मैं lsमैन पेज से गुजरा हूं लेकिन इस संदर्भ में कुछ भी नहीं पाया। कृपया मुझे बताएं कि क्या मैंने यहां कोई महत्वपूर्ण जानकारी खो दी है।

धन्यवाद


BASH में, ls --hide='temp_log.$$'काम करना चाहिए। आप वाइल्डकार्ड के साथ इसे बढ़ा भी सकते हैं, यह निर्भर करता है कि पूरे कार्यकाल temp_log.$$का कौन सा हिस्सा है।
erch

जवाबों:


25

जीएनयू ls(गैर-एम्बेडेड लिनक्स और साइगविन पर संस्करण, कभी-कभी अन्यत्र भी पाया जाता है) के साथ, आप निर्देशिका को सूचीबद्ध करते समय कुछ फ़ाइलों को बाहर कर सकते हैं।

ls -I 'temp_log.*' -lrt

(की लंबी प्रपत्र ध्यान दें -Iहै --ignore='temp_log.*')

Zsh के साथ, आप शेल को फ़िल्टर करने दे सकते हैं। मिलान निर्देशिकाओं की सामग्री को सूचीबद्ध करने से बचने के -dलिए पास करें ls

setopt extended_glob          # put this in your .zshrc
ls -dltr ^temp_log.*

Ksh, bash या zsh के साथ, आप ksh फ़िल्टरिंग सिंटैक्स का उपयोग कर सकते हैं। Zsh में, setopt ksh_globपहले दौड़ें । बैश में, shopt -s extglobपहले दौड़ें ।

ls -dltr !(temp_log.*)

कृपया, GNU ls: ls -I 'temp_log के लिए उदाहरण में एक भी उद्धरण नहीं। * -Lrt वे कमांड को पैटर्न पास करने के लिए आवश्यक हैं और शेल को इसे विस्तारित नहीं होने देते।
शार्गर्स

उबंटू बैश v4.3.48 पर, यह -Itemp_log.*बिना किसी स्थान के बाद होना चाहिए-I
यान किंग यिन

1
@YanKingYin नहीं, इसके बाद एक स्थान होना ठीक है -I। हालाँकि, *एक या दूसरे तरीके को उद्धृत करने की आवश्यकता है। -I temp_log.*काम नहीं करता है लेकिन -I 'temp_log.*', -I "temp_log.*", -I temp_log.\*, आदि ठीक कर रहे हैं।
गिल्स एसओ- बुराई को रोकना '

10

आप grepविकल्प के साथ उपयोग कर सकते हैं -v

ls -lrt | grep -v <exclude-filename-part>

1
निश्चित नहीं है कि यह क्यों अस्वीकृत किया गया, यह सही उत्तर है।
टिम कैनेडी

5
Ls आउटपुट पर grep करना हमेशा सही नहीं होता है और इसकी अनुशंसा नहीं की जाती है। इसके साइड इफेक्ट्स हैं। सटीक मुद्दों को याद करने में सक्षम नहीं है। साइड नोट - डाउन वोट मुझसे नहीं था;)
mtk

1
यहाँ लिंक के रूप में क्यों पार्स ls एक बुरा विचार है
mtk

3

आप इसके लिए उपयोग कर सकते हैं find:

find . \! -name 'temp_log*'

यह केवल नामों को प्रिंट करेगा, आप टाइमस्टैम्प और अनुमतियों के साथ -lsएक ls -lस्टाइल आउटपुट बनाने के लिए जोड़ सकते हैं , या -exec ls {} +वास्तव में कॉलम, सॉर्टिंग आदि के लिए जो भी विकल्प चाहते हैं उसके साथ पास करने के लिए उपयोग कर सकते हैं।

मैंने लिखा कि यह एक निर्देशिका में सिर्फ फाइलें थी। यदि निर्देशिका में अन्य निर्देशिकाएँ हैं, तो आप उन्हें पुन: सूचीबद्ध करने से बचना चाहते हैं

find . \! -name 'temp_log*' -maxdepth 1

और यदि आप ls का उपयोग करते हैं, तो आप -d विकल्प को पास करना चाहेंगे ताकि इसे निर्देशिका के अंदर सूचीबद्ध करने से रोका जा सके:-exec ls -d {} +


शायद -maxdepth 1गैर-पुनरावर्ती की नकल करना चाहते हैं ls
jw013

अच्छा लगा। जिन उपयोगकर्ताओं के पास findबिना अधिक न्यूनतम POSIX है, -maxdepth उन्हें यहां देखना चाहिए
वाइल्डकार्ड

2

मुझे लगता है कि आप शेल की एक विशेषता का उपयोग करना चाहते हैं, नहीं ls। मैं बैश का उपयोग करता हूं, इसलिए मैंने आपको क्या चाहिए, इसकी जांच की man bash। "^ विस्तार" के लिए खोजें, (पहले दबाकर '/')। अंश:

विस्तार

    विस्तार को कमांड लाइन पर शब्दों में विभाजित करने के बाद किया जाता है। सात प्रकार के विस्तार प्रदर्शन किए गए हैं: ब्रेस विस्तार , टिल्ड विस्तार , पैरामीटर और चर विस्तार , कमांड प्रतिस्थापन , अंकगणितीय विस्तार , शब्द विभाजन , और पथनाम विस्तार

   Ip
... <स्निप> ...
   ip

पथनाम विस्तार

    शब्द बंटवारे के बाद, जब तक -f विकल्प सेट किया गया है, बैश पात्रों के लिए प्रत्येक शब्द को स्कैन करता है *, ?और [। यदि इन वर्णों में से एक दिखाई देता है, तो शब्द को एक पैटर्न के रूप में माना जाता है , और पैटर्न से मेल खाने वाले फ़ाइल नामों की वर्णानुक्रम में क्रमबद्ध सूची के साथ प्रतिस्थापित किया जाता है। ...

मैंने हाल ही में अपने पहले अक्षर के आधार पर फाइलों को बाहर करना शुरू कर दिया है, जैसे कि एक कमांड:

$ ls ./[^t]*

यह ऐसी किसी भी चीज से मेल खाता होगा जो अक्षर से शुरू नहीं होती है t। यदि आप कोष्ठक के बीच अधिक वर्ण जोड़ते हैं, तो आप उन अक्षरों से शुरू होने वाली फ़ाइलों को भी बाहर कर देते हैं।

एक लिंक की तलाश है, और मैं एक अच्छा हूँ! पैटर्न मिलान देखें । वहां से, यह आपके मामले के लिए काम करेगा:

$ ls -lrt ./!(temp_log.*)

इसके लिए आवश्यक है कि extglobशेल विकल्प shoptबिलिन ( shopt -s extglob) का उपयोग करके सक्षम किया जाए , जैसा कि गिल्स द्वारा कहा गया है ।


-1

बस करो

ls -ltr `grep -il patterntosearch  *`

grepफ़ाइल नाम के बजाय फ़ाइल के भीतर एक पैटर्न की खोज करता है।
ईविल २३'१३

-2

फ़ाइलों के बाद से है कि आप मुद्रित चाहते हैं "temp_log।" है फ़ाइल नाम में, फिर grep के साथ फ़िल्टर करें:

ls -lrt | grep -v "temp_log."

ध्यान दें: एक समान उत्तर वाली दूसरी पोस्ट शायद नीचे उतारी गई क्योंकि उपयोगकर्ता ने स्ट्रिंग के चारों ओर "" उद्धरण शामिल नहीं किया था जिसे grep की तलाश होनी चाहिए। उद्धरण के बिना, यह विज्ञापित के रूप में काम नहीं करता है।


आपका 'नोट' कड़ाई से सही नहीं है। कुछ पात्र हैं जिन्हें उद्धृत करने की आवश्यकता हो सकती है, लेकिन मुझे नहीं लगता कि उस विशेष स्ट्रिंग में कोई भी है।
स्मोक्स 2345

एक उपयोगकर्ता या समूह "temp_log" नाम नहीं है जब तक (regex के डॉट से पहले अंतरिक्ष या कुछ भी निम्नलिखित मेल खाएंगे temp_logयह एक अच्छा (सामान्य) जिस तरह से बाहर करने के लिए नहीं है। lsपरिणाम नहीं।
जेफ स्कालर

केवल -F, @ smokes2345 के साथ; एक अवधि एक नियमित नियमित अभिव्यक्ति में किसी भी चरित्र से मेल खाएगी। देखें: unix.stackexchange.com/q/119905/117549
Jeff Schaller
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.