शैल वाइल्डकार्ड में OR पैटर्न का उपयोग करना


52

मेरी डायर की सामग्री हैं

$ ls -lrt
total 0
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 noon.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

मैं उन फ़ाइलों का विवरण बाहर सूचीबद्ध करना चाहूंगा जिनके पास निर्दिष्ट रूप में फ़ाइल नाम में एक शब्द है।

उदाहरण :

$ ls -lrt *day|night*
ls: *day: No such file or directory
bash: night.txt: command not found

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

-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

2 अलग-अलग पार्टनर से मेल खाते अलग-अलग फाइलों को कैसे सूचीबद्ध करें, या संक्षेप में रेगेक्स का उपयोग कैसे करें ls, ताकि मैं ORफ़ाइल नाम वाले हिस्सों को रख सकूं ।

मूल विचार, निर्देशिका में कई फ़ाइल हैं, पूछने के लिए मामले को छोटा कर दिया है।

जवाबों:


65

आपको वह विस्तारित ग्लोबिंग की आवश्यकता भी नहीं है जो आप चाहते हैं। यह काम करेगा:

ls {day*,night*}

7
नहीं यह नहीं है: touch day.txt; touch night.txt; ls {*day,night*}परिणामls: *day: No such file or directory
Matteo

1
मैं मूल पोस्टर के पाठ को अपना रहा था; मुझे लगा कि स्पष्ट है। आह । पाठ अपडेट किया गया। निश्चित रूप से आप देख सकते हैं कि तंत्र काम करता है?
इसका शानदार

7
या संभवतः *{day,night}*ओपी जो चाहता है उसके करीब है।
derobert

25

lsफ़ाइल नाम पर फ़िल्टर करने का कोई विकल्प नहीं है, लेकिन अधिकांश गोले में ग्लोबिंग एक्सटेंशन हैंman bash /Pattern Matching

क्ष

ls -lrtd -- *@(day|night)*

zsh

setopt extendedglob
ls -lrtd -- *(day|night)*

या:

setopt kshglob
ls -lrtd -- *@(day|night)*

दे घुमा के

shopt -s extglob
ls -lrtd -- *@(day|night)*

इन तीन में से किसी भी गोले में आप ऐसा कर सकते हैं, लेकिन ध्यान दें कि यदि कोई भी मामला किसी फाइल से मेल नहीं खाता है, तो उस पैटर्न को अनएक्सपेन्डेड छोड़ दिया जाएगा (जैसे *day* night1.txt othernight.txtअगर कोई फ़ाइल नाम नहीं है day; देखें man bash /EXPANSIONया /Brace Expansionविशेष रूप से):

ls -lrtd -- *{day,night}*

किसी भी गोले में आप कर सकते हैं:

ls -lrtd -- *day* *night*

Zsh में, यदि dayया तो कोई nightफ़ाइल नहीं है, तो अंतिम दो कमांड विफल हो जाएंगे; इससे बचने के लिए प्रत्येक पैटर्न के बाद nonomatchया csh_null_globविकल्प सेट करें , या जोड़ें (N)


1
किस बारे में *{day,night}*? मैं इसे संपादित करूँगा, लेकिन मुझे नहीं पता कि कौन से गोले इसका समर्थन करते हैं?
रैंडम 832

@ Random832 में काम करता है bash, kshऔर zsh(किसी को भी विस्तारित ग्लोबिंग की आवश्यकता नहीं है), लेकिन नहीं sh- हालांकि, नाहुएल का आखिरी "सभी गोले" उदाहरण में काम करता है sh
इजाकाटा

14

तर्क विस्तार के लिए गोले नियमित अभिव्यक्तियों का उपयोग नहीं करते हैं।

आप द्वारा विस्तारित विस्तारित पैटर्न को सक्षम कर सकते हैं

$ shopt -s extglob

और फिर

$ ls @(day|night).txt
day.txt   night.txt

उदाहरण के लिए बैश संदर्भ मैनुअल (पैटर्न मिलान) देखें

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