जवाबों:
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
परिणाम पारित कर सकते हैं क्योंकि यह टूट नहीं जाएगाwhile
for
पहले सीडी के लिए निर्देशिका 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
लक्ष्य निर्देशिका में एक उपनिर्देशिका बनाने में विफल होगा जिसमें फोटो नाम की एक फ़ाइल है । आपने निर्दिष्ट नहीं किया है कि उन मामलों में क्या किया जाना चाहिए हालांकि और अब तक पोस्ट किए गए अन्य सभी उत्तरों में भी यह सीमा है।