मैं बैश का उपयोग करके एक अलग निर्देशिका में विशिष्ट फाइलें कैसे चुन सकता हूं?


13

मैं एक निर्देशिका में कुछ फाइलों पर सूची (या हटाना, या कुछ अन्य ऑपरेशन करना) चाहता हूं, जैसे:

$ ls /opt/somedir/
aa  bb  cc  aa.txt  bb.txt  cc.txt
$ ls /opt/somedir/(aa|bb|cc)  ## pseudo-bash :p
aa  bb  cc

मैं इसे कैसे प्राप्त कर सकता हूं (पहले निर्देशिका में सीडी-आईएनजी के बिना)?

जवाबों:



3

बैश के तहत, चलाएं shopt -s extglob(या इसे अपने में डाल दें ~/.bashrc), और आप अतिरिक्त पैटर्न का उपयोग कर सकते हैं जो एक असामान्य वाक्यविन्यास (ksh से विरासत में मिला) के साथ नियमित अभिव्यक्ति प्रदान करते हैं। आप इन पैटर्नों का उपयोग ksh में भी कर सकते हैं, बेशक, और बाद में भी zsh में setopt ksh_glob

$ shopt -s extglob
$ ls /opt/somedir/@(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

Zsh में, आप सीधे (foo|bar)पैटर्न के रूप में उपयोग कर सकते हैं ।

% ls /opt/somedir/(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

ध्यान दें कि कमांड को पूर्ण पथ के साथ कहा जाता है। यदि आप एक छोटे से मार्ग के साथ कमांड को कॉल करना चाहते हैं, तो आपको निर्देशिका को किसी भी तरह बदलना होगा, और (cd /opt/somedir && somecommand aa bb cc)अब तक का सबसे आसान तरीका है।


यदि आप बारीकी से देखते हैं, तो आप देखेंगे कि मैं अपने सवाल में "निर्देशिका में सीडी-आईएनजी के बिना" निर्दिष्ट करता हूं;)
नीयू 242

1

आप उपयोग करके फ़िल्टर कर सकते हैं egrep:

ls | egrep '(aa|bb|cc)'

सभी पाठ फ़ाइलों को खोजने के लिए:

ls | egrep '(aa|bb|cc).txt'

1
डॉट हर चरित्र से मेल खाएगा, और यह दृष्टिकोण इन फाइलों पर आगे काम करना मुश्किल बनाता है
enzotib

1
मुझे लग रहा है कि ls सिर्फ एक उदाहरण कमांड था।
रैंडम 832

हाँ, आप सही हैं, मैंने निर्दिष्ट किया कि मैं एक ऑपरेशन करना चाहता हूं: फाइलों को सूचीबद्ध करना केवल एक उदाहरण था।
neu242

अच्छी टिप्पणी प्रिय दोस्तों, धन्यवाद। सौभाग्य neu242: D
महासागर

1

पहले, मैं आपको निर्देशित करता हूं: कभी भी पार्स एलएस , कभी नहीं । जो आप चाहते हैं उसे करने के लिए उचित और विहित तरीका खोजें

उदाहरण के लिए:

find /opt/somedir -regex '.*[aa|bb|cc].*' -exec mv '{}' ~/backup \;

मैं आमतौर पर -nameइसके बजाय उपयोग करता हूं -regexक्योंकि यह सरल है। लेकिन एक रेगेक्स आपके उपयोग के मामले में फिट बैठता है। आपको पहली बार बिना कमांड चलाने चाहिए -exec, यह सुनिश्चित करने के लिए कि वे वास्तव में वे फाइलें हैं जिन्हें आप स्थानांतरित / हटाना चाहते हैं।


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