UNIX वाइल्डकार्ड के साथ सूची फ़ाइल श्रेणी


14

उदाहरण के लिए कहें कि मेरे पास मेरी कार्यशील निर्देशिका में निम्नलिखित फाइलें हैं: mjk0001.fits, mjk0002.fits, ... संख्यात्मक रूप से mjk9999.fits के लिए सभी तरह से बढ़ रही है।

क्या UNIX वाइल्डकार्ड्स का उपयोग करने का एक तरीका है जो उनमें से एक क्रमिक समूह को सूचीबद्ध या संचालित करने के लिए है? उदाहरण के लिए, यदि मुझे 0050 के माध्यम से 0025 पर एक प्रक्रिया चलाने की आवश्यकता है, तो मैं किस प्रारूप का उपयोग करूंगा?

मैंने निम्नलिखित कोशिश की है लेकिन कोई सफलता नहीं मिली है:

ls *[25-50].fits
ls mjk00[25-50].fits
ls mjk[0025-0050]*
ls *[0025-0050]*

सभी को अग्रिम धन्यवाद, एमके


संदर्भ के लिए: पैटर्न मिलान , ग्लोबिंग
IGNIS

जवाबों:


20

आप ब्रेस विस्तार का उपयोग कर सकते हैं:

ls mjk00{25..50}.fits

यदि आवश्यक हो तो अग्रणी शून्य को शामिल किया जा सकता है:

ls mjk0{000..149}.fits

1
इस सिंटैक्स का उपयोग करके, आप एक चरण मान भी निर्दिष्ट कर सकते हैं {25..50..2}:।
नोबार

1

सीधे नहीं, लेकिन आप कई ग्लोब पैटर्न का उपयोग कर सकते हैं:

ls mjk002[56789].fits mjk00[34]?.fits

यह बिल्कुल वैसा नहीं है जैसा आप ढूंढ रहे हैं, बल्कि यह निकटतम चीज़ है जो ग्लोब पैटर्न प्रदान करता है, और यह निश्चित रूप से प्रत्येक फ़ाइल सिस्टम टाइप करने से बेहतर है। प्रति संख्यात्मक रेंज के लिए आपको कम से कम पैटर्न की आवश्यकता होती है, जो रेंज के संख्यात्मक समापन बिंदु के लॉग से घिरा होता है।


1

आप grep के साथ एक रेगेक्स का उपयोग कर सकते हैं। मैं रेगेक्स गुरु नहीं हूं। निम्नलिखित संख्या 25-50 के साथ पैटर्न को लौटाती है:

ls | sort -n | grep -E 'mjk00([2][5-9]|[3-4][0-9]|[5][0]).fits'

मुझे नहीं पता कि क्या यह संभव है और अंततः इसे grep के साथ कैसे सामान्य किया जाए।


0

forलूप का उपयोग करके अधिक पोर्टेबिलिटी या लचीलापन प्राप्त करना संभव हो सकता है और printf:

for i in $(seq 25 50 1) ; do ls --escape $(printf "mjk%04d*" $i) ||true; done

यह रिक्त स्थान को अच्छी तरह से संभालता है और परिणाम xargsआगे की प्रक्रिया के लिए पाइपिंग के लिए अच्छी तरह से अनुकूल हैं ।

कई मिलान वाले नंबरों के परिणामस्वरूप सभी मिलान की गई फ़ाइलों को सूचीबद्ध किया जाएगा।

बिना मिलान वाले नंबर, stderr पर एक त्रुटि की सूचना देंगे, लेकिन ||trueएक बैश-स्तरीय त्रुटि रिटर्न को दबा देता है।


मूल मामले में, हालांकि, का उपयोग करना forऔर printfअधिक संक्षिप्त से अलग नहीं है:

ls --escape mjk{0025..0050..1}* ||true

अगर आप ब्रेस विस्तार के परिणामों को अलग करना चाहते हैं, तो आप लूप के लिए उपयोग कर सकते हैं:for i in {025..050} ; do ... ; done
nobar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.