সমস্ত ডিরেক্টরি ভিতরে পুনরাবৃত্তভাবে একটি ফোল্ডার "ফটো" তৈরি করুন


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
আমি অবশ্যই ls পার্সিং এড়াতে চাই , এটি অস্বাভাবিক উপায়ে ব্যর্থ হতে পারে। আমি মনে করি যে এড়ানো উত্তরগুলি সম্ভবত নিরাপদ।
অ্যারোনিকাল

3
@ অ্যারোনিকাল lsপার্স করা হয়নি। এটি কেবল ব্যবহারকারীর প্রতিক্রিয়া ... যা ঘটছে তা দেখাচ্ছে। "এটি একটি ফটো ডিরেক্টরি" শব্দের মতোই। এটি সেখানে ডিরেক্টরি কেন তৈরি করছে না তা এটি ব্যবহারকারীকে জানিয়ে দিচ্ছে।
এলডি জেমস

1
আমি ভেবেছিলাম যে এটি হতে পারে, কারণ আমি এটি দিয়ে কিছুই করা হচ্ছে না see
সেক্ষেত্রে

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? :) হ্যাঁ, এটি বেশ পাল্টা স্বজ্ঞাত তবে শেখার পক্ষে মূল্যবান।
মেলিবিয়াস

'ফটো' নামের একটি ফাইল উপস্থিত থাকলে এটি 'ফটো' ফোল্ডার তৈরি করা বন্ধ করবে?
আনোয়ার

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পরিবর্তে এটি সম্পাদন করার পরামর্শ দিচ্ছি , @ এলডিজেমস সম্পাদিত
জান্না

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

ব্যাখ্যা

আমরা যে কমান্ডটি নিয়ে কাজ করছি তা হ'ল অজগর-সি 'আমদানি ওএস; [ওএস.এমকেডির (r + "/ ছবি") r, d, f এর জন্য ওএসওয়াক ("।")]' '

এখানে আমরা কেবলমাত্র -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কোনও লক্ষ্য ডিরেক্টরিতে একটি সাবডিরেক্টরি তৈরি করতে ব্যর্থ হবে যাতে ফটো নামক একটি ফাইল রয়েছে । এই ক্ষেত্রে কী করা উচিত তা আপনি নির্দিষ্ট করেননি যদিও এখনও অবধি পোস্ট করা সমস্ত উত্তরগুলিরও এই সীমাবদ্ধতা রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.