सभी निर्देशिकाओं के अंदर एक फोटो "फोटो" बनाएँ


9

मेरे पास फ़ोल्डर्स का एक गुच्छा है और मैं उन सभी फ़ोल्डरों पर लूप करना चाहता हूं और प्रत्येक फ़ोल्डर में "फोटो" नाम का एक और फ़ोल्डर बनाता हूं

F1
--F11
----F111
----F112
--F12

मैं चाहता हूँ:

F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo

जवाबों:


8

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
  • गैर-स्टैंडर फ़ाइलों के लिए जोड़ा गया समर्थन (टेराडन के सुझावों के साथ)।

1
मैं निश्चित रूप से पार्सिंग एलएस से बचना चाहूंगा , यह असामान्य तरीकों से विफल हो सकता है। मुझे लगता है कि इससे बचने वाले उत्तर शायद सुरक्षित हैं।
एरॉनिकल

3
@ एरोनिकल lsपार्स नहीं है। यह केवल उपयोगकर्ता के लिए प्रतिक्रिया है ... दिखा रहा है कि क्या हो रहा है। जैसे शब्द "यह एक फोटो डायरेक्टरी है"। यह उपयोगकर्ता को यह बताने देता है कि वह वहां निर्देशिका क्यों नहीं बना रहा है।
एलडी जेम्स

1
मैंने सोचा था कि मामला हो सकता है, क्योंकि मैं इसके साथ कुछ भी नहीं देख सकता था। उस स्थिति में, मैं अपनी टिप्पणी को वापस
लेता

find -type d F1, शायद?
ओलिवियर ग्रेगोइरे

ध्यान दें कि यह विफल हो जाएगा यदि कोई फ़ाइल (और निर्देशिका नहीं) नामक है $i/Photo, लेकिन ओपी ने निर्दिष्ट नहीं किया है कि ऐसे मामले में क्या किया जाना चाहिए। यह भी, संयुक्त रूप से संभावनाहीन मामले में विफल हो जाएगा, जहां $iएस में से एक में एक नई रेखा होती है।
टेराडन

24

आप एक findकॉल का उपयोग करके इसे प्राप्त कर सकते हैं ।

find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;

भाग -name 'Photo' -prune -oमौजूदा (और नए बनाए गए) Photoनिर्देशिकाओं की पुनरावृत्ति नहीं करने के लिए कहता है : यदि मिली हुई फ़ाइल (या निर्देशिका) का नाम है Photo, तो इसे संसाधित करना बंद करें ( -prune)। अन्य मामले में ( -o), निर्देशिकाओं ( -type d) और निष्पादित ( -exec) कमांड के साथ जारी रखें ।


आह अच्छा, मैंने इसे इस तरह से आजमाया और मैंने आपके उत्तर से देखा कि मैं कहाँ गलत हो रहा था :)
ज़न्ना

@Zanna -prune? :) हाँ, यह काफी सहज है, लेकिन सीखने लायक है।
मेलेबियस

यदि exists फोटो ’नाम की कोई फाइल मौजूद है, तो क्या वह 'फोटो’ बनाने से रोक देगा?
अनवर

3
@ अनवर वर्तमान संस्करण होगा। आवश्यकताओं में एक ग्रे ज़ोन है। :) आप इसे पहले से -type dएक साथ निर्दिष्ट करके बदल सकते हैं । -name 'Photo'-prune
मेलेबियस

2
@ अनवर दूसरी नज़र में, इसका कोई मतलब नहीं होगा। आप एक ही नाम के साथ एक फ़ोल्डर में एक नियमित फ़ाइल के रूप में एक फ़ोल्डर नहीं बना सकते। और findअन्य फ़ोल्डर (उस फ़ोल्डर के सबफ़ोल्डर सहित, यदि आप उस के लिए पूछ रहे हैं) के साथ जारी रहेगा।
मेलेबियस

9

यदि फ़ाइलनाम में स्थान है तो आप इसके बजाय 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
Zanna

5

अजगर के साथ 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"एक पथ बनाने के लिए उपनिर्देशिका स्ट्रिंग और "/ पिक्चर्स" स्ट्रिंग को एक साथ जोड़ने के लिए सिर्फ एक सरल स्ट्रिंग हेरफेर है

अपनी आवश्यकताओं को पूरा करने के लिए "/ चित्र" को "/ फोटो" से बदलें


4

यदि आप बैश का उपयोग कर रहे हैं, तो आप बस चला सकते हैं:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.