जवाबों:
F1 से ऊपर की निर्देशिका से इस स्क्रिप्ट को चलाएं:
स्क्रिप्ट का उद्देश्य फोटो निर्देशिकाओं के तहत बनाए गए अनावश्यक फोटो निर्देशिकाओं से बचना है।
इसके अलावा, यह गलती से उपयोगकर्ता के रूट निर्देशिका जैसे गलत स्थान से इसे रोकने के लिए डिज़ाइन है, जबकि यह F1निर्देशिका नहीं देखेगा और गलती से गलत महलों में सैकड़ों फोटो निर्देशिका बना देगा।
इसके अलावा, स्क्रिप्ट का पालन करना आसान बनाने के लिए मेरा इरादा था ताकि उपयोगकर्ता इसे अनुकूलित कर सके।
#!/bin/bash
while IFS= read -r -d '' i;
do
if [[ ! -d $i/Photo ]]; then
# Filter to skip folders named Photo
thisfolder="$(echo $i | sed "s/.*\///")"
if [[ ! $thisfolder == "Photo" ]]; then
mkdir "$i/Photo"
fi
fi
done < <(find F1 -type d -print0)
स्क्रिप्ट अपडेट किया गया:
pमें बदल दिया photo।lsपार्स नहीं है। यह केवल उपयोगकर्ता के लिए प्रतिक्रिया है ... दिखा रहा है कि क्या हो रहा है। जैसे शब्द "यह एक फोटो डायरेक्टरी है"। यह उपयोगकर्ता को यह बताने देता है कि वह वहां निर्देशिका क्यों नहीं बना रहा है।
find -type d F1, शायद?
$i/Photo, लेकिन ओपी ने निर्दिष्ट नहीं किया है कि ऐसे मामले में क्या किया जाना चाहिए। यह भी, संयुक्त रूप से संभावनाहीन मामले में विफल हो जाएगा, जहां $iएस में से एक में एक नई रेखा होती है।
आप एक findकॉल का उपयोग करके इसे प्राप्त कर सकते हैं ।
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
भाग -name 'Photo' -prune -oमौजूदा (और नए बनाए गए) Photoनिर्देशिकाओं की पुनरावृत्ति नहीं करने के लिए कहता है : यदि मिली हुई फ़ाइल (या निर्देशिका) का नाम है Photo, तो इसे संसाधित करना बंद करें ( -prune)। अन्य मामले में ( -o), निर्देशिकाओं ( -type d) और निष्पादित ( -exec) कमांड के साथ जारी रखें ।
-prune? :) हाँ, यह काफी सहज है, लेकिन सीखने लायक है।
-type dएक साथ निर्दिष्ट करके बदल सकते हैं । -name 'Photo'-prune
findअन्य फ़ोल्डर (उस फ़ोल्डर के सबफ़ोल्डर सहित, यदि आप उस के लिए पूछ रहे हैं) के साथ जारी रहेगा।
यदि फ़ाइलनाम में स्थान है तो आप इसके बजाय findपरिणाम पारित कर सकते हैं क्योंकि यह टूट नहीं जाएगाwhilefor
पहले सीडी के लिए निर्देशिका F1, फिर करते हैं:
find -type d | while read dir ; do mkdir "$dir"/Photo ; done
यदि निर्देशिका मौजूद mkdirहै, तो इसे बनाने से मना कर देगी, इसलिए वहां कोई समस्या नहीं है ...
यदि आपकी निर्देशिका के नामों में नई सूची या अन्य विदेशी विचित्रता हो सकती है, तो इसका उपयोग करें जो मनमाने नामों से निपट सकते हैं:
find -type d -print0 | while IFS= read -r -d '' dir ; do mkdir "$dir"/Photo ; done
इस के साथ मदद के लिए @terdon के लिए धन्यवाद :)
F1डायरेक्टरी है ~user/Pictures, पैरेंट डाइरेक्टरी में जाना और लाइन को रन करना एक Photoडायरेक्टरी को उसके स्पेस में हर डाइरेक्टरी में रखेगा , जो हजारों हो सकती है। F1आसानी से की गई गलती से बचने के लिए कमानी के हिस्से के रूप में जोड़ने पर विचार करें । इस तरह अगर यह अनजाने में गलत जगह से चलाया जाता है, तो यह निर्देशिका नहीं बनाएगा।
F1इसके बजाय इसे करने का सुझाव देता हूं , @LDJames
अजगर के साथ os.walkयह काफी आसानी से और कोड की केवल कुछ पंक्तियों में कर सकते हैं
$ mkdir dir_one dir_two
$ mkdir dir_two/dir_three
$ python -c 'import os;[os.mkdir(r + "/Pictures") for r,d,f in os.walk(".")]'
$ tree
.
├── dir_one
│ └── Pictures
├── dir_two
│ ├── dir_three
│ │ └── Pictures
│ └── Pictures
└── Pictures
हम इस आदेश के साथ काम कर रहे हैं: python -c 'आयात os;
यहां हम केवल -cएकल उद्धरणों में दिए गए आदेश को निर्दिष्ट करने के लिए ध्वज के साथ अजगर इंटरप्रेटर कहते हैं । os.walk()फ़ंक्शन हमें सभी उपनिर्देशिकाओं के माध्यम से पुनरावृत्ति करने की अनुमति देता है, और प्रत्येक उपनिर्देशिका (द्वारा प्रतिनिधित्व r) के लिए, हम os.mkdir()फ़ंक्शन के माध्यम से चित्र फ़ोल्डर बनाते हैं । r+"/Pictures"एक पथ बनाने के लिए उपनिर्देशिका स्ट्रिंग और "/ पिक्चर्स" स्ट्रिंग को एक साथ जोड़ने के लिए सिर्फ एक सरल स्ट्रिंग हेरफेर है
अपनी आवश्यकताओं को पूरा करने के लिए "/ चित्र" को "/ फोटो" से बदलें
यदि आप बैश का उपयोग कर रहे हैं, तो आप बस चला सकते हैं:
shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done
globstarविकल्प बनाता है **से मेल खाते हैं "सभी फाइलों और 0 या अधिक निर्देशिका और उपनिर्देशिका"। दूसरे शब्दों में, यह सब कुछ पुनरावर्ती रूप से मेल खाता है। वजह से /अंत में, **/सभी निर्देशिकाओं और उप निर्देशिकाओं (कोई फ़ाइलें) से मेल खाएगी। इसलिए, $dवर्तमान निर्देशिका और उनकी उपनिर्देशिकाओं में सभी निर्देशिकाओं पर पुनरावृति होगी और Photosउनमें से प्रत्येक में निर्देशिका बनाई जाएगी।
मतलब का -pझंडा mkdir:
-p, --parents
no error if existing, make parent directories as needed
यहां, मैं इसका उपयोग केवल त्रुटि संदेशों को दबाने के लिए कर रहा हूं यदि लक्ष्य निर्देशिका पहले से मौजूद है। यदि आप त्रुटियां देखना चाहते हैं, तो इसे निकालें।
ध्यान दें कि यह Photoलक्ष्य निर्देशिका में एक उपनिर्देशिका बनाने में विफल होगा जिसमें फोटो नाम की एक फ़ाइल है । आपने निर्दिष्ट नहीं किया है कि उन मामलों में क्या किया जाना चाहिए हालांकि और अब तक पोस्ट किए गए अन्य सभी उत्तरों में भी यह सीमा है।