तो, मेरे पास रिक्त स्थान के साथ फ़ोल्डर नाम में कोष्ठक हैं:

फ़ोल्डर\फ़ोल्डर (2000)\file.srt

फ़ोल्डर\फ़ोल्डर (1990)\file.srt

for file in `find . -name "*.srt"`
do
 echo "file = $file";
done

मेरी स्क्रिप्ट में काम मत करो। कोई मुझे मदद कर सकता है?

0
LetterLin 21 जुलाई 2017, 18:01

2 जवाब

सबसे बढ़िया उत्तर

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

find . -name "*.srt" -exec echo "file = {}" \;

आउटपुट:

file = ./folder/folder (1990)/file.srt
file = ./folder/folder (2000)/file.srt
0
Tom 21 जुलाई 2017, 18:04

समस्या यह है कि find(1) द्वारा निर्मित फ़ाइल नामों में रिक्त स्थान \ns द्वारा अलग किए गए नामों में प्रतिच्छेदित हो रहे हैं, और 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) उपयोग नहीं मिलेगा, जितना संभव हो कॉल किए गए कमांड की कमांड लाइन में कई पैरामीटर डालते हैं। आप प्रत्येक फ़ाइल को एक बार में एक फ़ाइल संसाधित करेंगे।

0
Luis Colorado 24 जुलाई 2017, 08:37