तो, मेरे पास रिक्त स्थान के साथ फ़ोल्डर नाम में कोष्ठक हैं:
फ़ोल्डर\फ़ोल्डर (2000)\file.srt
फ़ोल्डर\फ़ोल्डर (1990)\file.srt
for file in `find . -name "*.srt"`
do
echo "file = $file";
done
मेरी स्क्रिप्ट में काम मत करो। कोई मुझे मदद कर सकता है?
2 जवाब
आप इसके लिए find -exec
का उपयोग कर सकते हैं:
find . -name "*.srt" -exec echo "file = {}" \;
आउटपुट:
file = ./folder/folder (1990)/file.srt
file = ./folder/folder (2000)/file.srt
समस्या यह है कि find(1)
द्वारा निर्मित फ़ाइल नामों में रिक्त स्थान \n
s द्वारा अलग किए गए नामों में प्रतिच्छेदित हो रहे हैं, और for
कमांड उन सभी को बिना किसी अंतर के प्राप्त करता है।
सबसे अच्छा तरीका (और एक जो कमांड को बचाता है) find(1)
का उपयोग -print0
विकल्प के साथ करना है, जो एक अशक्त वर्ण द्वारा अलग किए गए फ़ाइल नामों को प्रिंट करता है, और फिर xargs
कमांड का उपयोग xargs
के साथ करता है। -0
विकल्प, जो विभाजक के रूप में नल की अपेक्षा करता है। इस तरह आप एक कमांड को उतने ही मापदंडों के साथ निष्पादित कर सकते हैं जितना कि सिस्टम वहन कर सकता है। उदाहरण के लिए
find . -type f -name "* *" -print0 | xargs -0 cat
उन सभी फाइलों की सामग्री को प्रिंट करेगा जिनके नाम में एक स्थान है।
आपके उदाहरण में, आप प्रत्येक डेटा लाइन के साथ कुछ स्क्रिप्टिंग करना चाहते हैं, इसलिए read
शेल कमांड का उपयोग करने के लिए एक बेहतर तरीका होगा, जैसा कि (इस मामले में, आपको -print0
की आवश्यकता नहीं है। विकल्प, क्योंकि फ़ाइलें न्यूलाइन द्वारा सीमित हैं, इसलिए आप प्रति फ़ाइल एक फ़ाइल पढ़ेंगे)
find . -name "*.srt" | while read file
do
echo "file = ${file}"
done
लेकिन इस मामले में आपको कुशल xargs(1)
उपयोग नहीं मिलेगा, जितना संभव हो कॉल किए गए कमांड की कमांड लाइन में कई पैरामीटर डालते हैं। आप प्रत्येक फ़ाइल को एक बार में एक फ़ाइल संसाधित करेंगे।
संबंधित सवाल
नए सवाल
linux
LINUX QUESTIONS को संबंधित होना चाहिए। इस टैग का उपयोग केवल तभी करें जब आपका प्रश्न लिनक्स एपीआई या लिनक्स-विशिष्ट व्यवहार का उपयोग करके प्रोग्रामिंग से संबंधित हो, न कि केवल इसलिए कि आप लिनक्स पर अपने कोड को चलाने के लिए होते हैं। यदि आपको लिनक्स समर्थन की आवश्यकता है तो आप https://unix.stackexchange.com या विशिष्ट लिनक्स वितरण की स्टैक एक्सचेंज साइट जैसे https://askubuntu.com या https://elementaryos.stackexchange.com/ की कोशिश कर सकते हैं