সমস্ত উপ-ডিরেক্টরিতে আমি কীভাবে একটি ডিরেক্টরি তৈরি করব?


34

ধরুন আমার এর মতো ডিরেক্টরি কাঠামো আছে:

$ [~ / অনুশীলন] এলএস
এ বি সি ডি/

এখন আমি tmp1সমস্ত সাব ডিরেক্টরিতে একটি ডিরেক্টরি তৈরি করতে চাই practiceএবং আমি এটি করি:

$ [~ / অনুশীলন] এমকেডির * / টিএমপি 1
mkdir: ডিরেক্টরি তৈরি করতে পারে না `* / tmp1 ': এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই

তারপরে আমি -pস্যুইচটি চেষ্টা করি এবং আমি *একটি উপ ডিরেক্টরি সহ নামের ডিরেক্টরিতে শেষ করিtmp1

$ [~ / অনুশীলন] এমকেডির-পি * / টিএমপি 1

$ [~ / অনুশীলন] এলএস
*/ এ বি সি ডি/

আমি জানি -pসুইচ এর ব্যবহার হল একাধিক অস্তিত্বহীন ডিরেক্টরি তৈরি করা। আমি কেবল ভেবেছিলাম এটি সাহায্য করতে পারে।

আমি কীভাবে tmp1একবারে সমস্ত উপ-ডিরেক্টরিতে তৈরি করব ?

এই কাজ করা করতে পারেন, কীভাবে আমি এটি তৈরি প্রসারিত না \tmp1, \tmp2, \tmp3মধ্যে \a, \bএবং \cএকযোগে?

সম্পাদনা: আমি উল্লেখ যে ডিরেক্টরি সহজ এবং অনুক্রমে হতে, মত হবে না মিস a, b, cইত্যাদি, এবং ডিরেক্টরিটি তৈরি করা অগত্যা মত নয় tmp1, tmp2

$ [~ / অনুশীলন] এলএস
কুকুর / বিড়াল / ইঁদুর /

তাদের মধ্যে, আমি এমন কিছু চাই

$ [~ / অনুশীলন] এলএস *
কুকুর:
লাল নীল/

বিড়াল:
লাল নীল/

ইঁদুর:
লাল নীল/

1
প্রদত্ত ক্রিস্টোফার এর উত্তর , আপনি শোধন করা উচিত ", \ tmp1 তৈরি \ tmp2,, \ tmp3 এ \ একটি \ b এবং \ C" কিনা 3 বা 9 সাবডিরেক্টরি মোট ফল করা উচিত নয়।
মানবিক কাজ

@ মান্যাটওয়ার্ক: এটি একটি ভাল বিষয়। এটি 9 টি উপ-ডিরেক্টরি তৈরি করা উচিত।
অনিমেষ

ডিরেক্টরি sudo সন্ধানের নামে এই স্থানের সমস্যা সমাধানে আমার সহায়তা / / -ডেপথ-টাইপ ডি-এক্সেক ইকো '"{} / আরসিএস"' \;

উত্তর:


44

সঙ্গে globs :

for dir in */; do mkdir -- "$dir/tmp1"; done

বিঃদ্রঃ

  • গ্লোব */হিসাবে ব্যবহার করার সামান্য হ্যাকের সাথে আমি কেবল ডায়ারদের সাথে (ডায়ার টু সিমলিংক সহ) চিকিত্সা করি
  • আপনি যদি একবারে একাধিক সাবডিয়ার তৈরি করতে চান:

    for dir in */; do mkdir -- "$dir"/{tmp1,foo,bar,qux}; done


আমি কি for i in */; do mkdir "$i/itemone" "$i/itemtwo"; doneএকাধিক, অর্ড-অর্ডার ডিরেক্টরি নামের জন্য করতে পারি?
অনিমেষ

আমি এটি পরীক্ষা করেছি এবং এটি খুব সম্ভব। ধন্যবাদ।
অনিমেষ

আমার সম্পাদিত পোস্টটি দেখুন
গিলস কুইনট

1
ব্রেস সম্প্রসারণ উদ্ধৃত স্ট্রিংতে সঞ্চালিত হয় না।
manatwork

হ্যাঁ, ধন্যবাদ, সেই অনুসারে
স্টিফেন চ্যাজেলাস


10

জিএনইউ বা বিএসডি সহ * সন্ধান করুন:

find -mindepth 1 -maxdepth 1 -type d -exec mkdir {}/newdir \;

বা প্যারামিটার সম্প্রসারণ ব্যবহার:

dirs=(*/)
mkdir -- "${dirs[@]/%/newdir}"

* ওএস এক্স অন্তর্ভুক্ত


2
স্ট্যান্ডার্ড সন্ধান বাক্য গঠন সহ:find . -name . -o -prune -type d -exec sh -c 'exec mkdir "$1/newdir"' sh {} \;
স্টাফেন চাজেলা

1
দুটি সমাধানের মধ্যে পার্থক্যটিও নোট করুন: প্রথমটি হ'ল ডিরেক্টরিগুলি অন্তর্ভুক্ত করে, দ্বিতীয়টি বর্তমান ডিরেক্টরিতে যে কোনও সিমলিংক দ্বারা সংযুক্ত ডিরেক্টরিগুলিতে একটি নতুনদির যুক্ত করবে।
স্টাফেন চেজেলাস

6

আপনি যেহেতু উল্লেখ করছেন তা বন্ধ bash, তবে রেকর্ডের জন্য, zsh সহ, আপনি যা করতে চান:

dirs=(*(/))
mkdir -- $^dirs/tmp1

$^varঅ্যারের প্রসারণের জন্য ব্রেস-জাতীয় সম্প্রসারণ চালু করে । এটা তোলে কথা স্মরণ করিয়ে দেয় এর rc'র ^অপারেটর এবং rc(বা তার ব্যুৎপন্ন es), আপনি লিখতে চাই:

dirs=(*/)
mkdir -- $dirs^tmp1

তবে দ্রষ্টব্য (এবং এখানে প্রদত্ত বাশ সমাধানগুলিতে এটি একই প্রযোজ্য) যে আরসি সমাধানে dirsডিরেক্টরিগুলির সাথে প্রতীকী লিঙ্কও থাকবে। Zsh সমাধানে, *(/)আপনি *(-/)যদি ডিরেক্টরিগুলিতে symlinks অন্তর্ভুক্ত করতে চান তবে পরিবর্তন করুন ।


প্রতিলিপি সম্পর্কে আপনার পয়েন্টের জন্য +1! এই আচরণটি পছন্দসই হতে পারে, তবে ডুপ্লিকেট ডিরেক্টরি তৈরির বিষয়ে এমকেডিরের অভিযোগ -pপতাকা সহ দমন করা যায় ।
কোজিরো

4

বহনযোগ্যভাবে, মূল ডিরেক্টরিগুলি লুপ করুন:

for d in */; do mkdir "$d/red" "$d/blue"; done

আপনার নামের সাথে শুরু হওয়া ডিরেক্টরি থাকতে পারে তার --পরে যুক্ত করুন ।mkdir-

Zsh এ, আপনি গ্লোব e কোয়ালিফায়ার সহ একটি একক কমান্ডে এটি করতে পারেন :

mkdir *(/e\''REPLY=($REPLY/{red,blue})'\')

তবে এটি দুটি আদেশ হিসাবে টাইপ করা দ্রুত:

d=(*(/)); mkdir $^d/{red,blue}

1
একটি সাইটে যা একটি রেফারেন্স হিসাবে বোঝানো হয়েছে, আমি বরং "বলব mkdir -- whatever, এবং যদি আপনি সম্ভবত কমান্ডের বিকল্প হিসাবে নেওয়া হয় তবে যা কিছু বাড়ানোর জন্য চান তা বাদ দিন " " এখানে বাদ দেওয়ার কোনও মানে নেই। ওপি-র ক্ষেত্রে এটি সমস্যা নাও হতে পারে, তবে সাধারণ ক্ষেত্রে এটি একটি। আমি মনে করি আমাদের এখানে সঠিক এবং নিরাপদ সিনট্যাক্স শেখানোর কর্তব্য আছে। --mkdir--
স্টাফেন চেজেলাস

@ স্টেফেন চ্যাজেলাস একটি স্ক্রিপ্টিং প্রসঙ্গে, --যখন নতুন লাইনের সমর্থিত না হয় তখন আমি সবসময় সমস্ত প্রয়োজনীয় এবং কোট এবং বড় ফ্যাট সতর্কতা রাখি । কমান্ড লাইনের প্রসঙ্গে, আমি প্রথমে অনুশীলনে কাজ করে এমন দ্রুত সংস্করণ এবং বুলেটপ্রুফ সংস্করণটিকে পরিপূরক হিসাবে দেখাতে পছন্দ করি।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'


1

স্পটনিকের উত্তরের প্রকরণ যা ডিরেক্টরি ছাড়াই থাকা ফাইলগুলিকে এড়িয়ে চলে:

for x in *; do if [ -d "$x" ]; then mkdir "$x/tmp1"; fi; done

আমি কেবল ডায়ারদেরই চিকিত্সা করি, এটাই সমস্ত জাদু ...
গিলস কুইনট

শীতল, পেয়েছে;)
20:44

2
তা কি হওয়া উচিত নয় if [ -d "$x" ];…?
কোজিরো

হ্যাঁ। আমার কার্যত ফাইল
নামগুলিতে

1

পুরানো ইউনিক্স মাস্টার্স (ফ্রিবিএসডি 10.1-তে পরীক্ষা করা) এর থেকে ভাল এটি যদি আপনি সংস্করণ নিয়ন্ত্রণ করতে চান (আরসিএস লক ইন করা আছে: সিআই-এল একটি সংক্ষিপ্ত মন্তব্য সহ আইআর: প্রাথমিক প্রকাশের জন্য) আপনার / ইত্যাদি / * কনফিগার ফাইল ~ / .এইচ / ইত্যাদিতে

sudo rsync -av /etc/ ~/.his
sudo find -d ~/.his/etc -type d -exec echo '{}/RCS' \; | xargs sudo mkdir -p
sudo find -d ~/.his/etc \! -name "RCS" | xargs sudo ci -l -mir -t-ir

আমি এটি দেখতে ব্যর্থ হয়েছি কীভাবে এই ওপি
আরচেমার

1

হতে হবে \! "আরসিএস" নাম দিন এবং এটি প্রথম চেক ইনে সেরা কাজ করে।

sudo সন্ধান করুন ~ / .এই / ইত্যাদি \! -নাম "আরসিএস" -এল

sudo সন্ধান করুন -ড। / .এই / ইত্যাদি \! -নাম "আরসিএস" | xargs sudo ci -l -mir -t-ir

ফাইলের নামে সমস্ত আরসিএস বিষয়বস্তু ফিল্টার করে সিজেকের জন্য এটি শেষটি খুব ভাল কাজ করে:

sudo সন্ধান করুন -ড ~ / .এই / ইত্যাদি-টাইপ চ | grep -v আরসিএস | xargs sudo ci -l -mir -t-ir


1

এটি আমার জন্য একটি দুর্দান্ত সহায়তা। আমার একাধিক ফোল্ডারে উপ-ডিরেক্টরিগুলির একটি সেট তৈরি করার দরকার ছিল এবং এর মতো:

!/bin/sh

cd /dest/cont

for dir in */*/; do
    mkdir -p -- $dir/{FB,Video,Audio,proj};
done

যখন কোনও সাদা স্থানের মুখোমুখি হয় তবে ব্যতীত দুর্দান্ত কাজ করে। */*/যুক্তিগুলির অংশে ফাঁকা স্থান উপেক্ষা করার কোনও উপায় আছে ?

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