जब भी मैं कई वर्षों से BASH का उपयोग कर रहा हूं, BASH स्क्रिप्टिंग के साथ मेरा अनुभव अपेक्षाकृत सीमित है।
मेरा कोड नीचे है। यह वर्तमान निर्देशिका के भीतर से पूरी निर्देशिका संरचना को पकड़ना चाहिए और इसे फिर से भरना चाहिए $OUTDIR
।
for DIR in `find . -type d -printf "\"%P\"\040"`
do
echo mkdir -p \"${OUTPATH}${DIR}\" # Using echo for debug; working script will simply execute mkdir
echo Created $DIR
done
समस्या यह है, यहाँ मेरी फ़ाइल संरचना का एक नमूना है:
$ ls
Expect The Impossible-Stellar Kart
Five Iron Frenzy - Cheeses...
Five Score and Seven Years Ago-Relient K
Hello-After Edmund
I Will Go-Starfield
Learning to Breathe-Switchfoot
MMHMM-Relient K
रिक्त स्थान पर ध्यान दें: -S और for
शब्द द्वारा पैरामीटर शब्द लेता है, इसलिए मेरी स्क्रिप्ट का आउटपुट कुछ इस तरह दिखता है:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Learning"
Created Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot"
Created Breathe-Switchfoot
लेकिन मुझे इसके आउटपुट से पूरे फाइलनाम (एक समय में एक लाइन) को हथियाने की आवश्यकता है find
। मैंने find
प्रत्येक फ़ाइलनाम के आसपास डबल-कोट्स बनाने की भी कोशिश की है । लेकिन यह मदद नहीं करता है।
for DIR in `find . -type d -printf "\"%P\"\040"`
और इस परिवर्तित लाइन के साथ आउटपुट:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"""
Created ""
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"Learning"
Created "Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot""
Created Breathe-Switchfoot"
अब, मुझे कुछ इस तरह की आवश्यकता है कि मैं इस तरह के माध्यम से पुनरावृत्ति कर सकता हूं, क्योंकि मैं gstreamer
एक समान संरचना में प्रत्येक फ़ाइल पर एक और अधिक जटिल कमांड चलाने की इच्छा रखता हूं । मुझे यह कैसे करना चाहिए?
संपादित करें: मुझे एक कोड संरचना की आवश्यकता है जो मुझे प्रत्येक निर्देशिका / फ़ाइल / लूप के लिए कोड की कई लाइनें चलाने की अनुमति देगा। क्षमा करें यदि मैं अस्पष्ट था।
समाधान: मैंने शुरू में कोशिश की:
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
इसने अधिकांश भाग के लिए ठीक काम किया। हालाँकि, मैंने बाद में पाया कि जब सब-ओवर में चलने वाले लूप में पाइप का परिणाम होता है, तो लूप में सेट किए गए कोई भी चर बाद में अनुपलब्ध थे जो एक त्रुटि काउंटर को लागू करना काफी मुश्किल बना। मेरा अंतिम समाधान ( SO पर इस उत्तर से ):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
इसने मुझे बाद में लूप के भीतर सशर्त रूप से वृद्धि चर की अनुमति दी जो बाद में स्क्रिप्ट में उपलब्ध रहेगी।
/
और लेकिन अनपेक्षित वर्णों की अनुमति देता हूं । लेकिन कुछ भी अनुमति दी जाती है /
और \0
इसलिए आपको उन्हें अनुमति देनी चाहिए।