আমি কীভাবে একটি ডিরেক্টরি থেকে সমস্ত উপ-ডিরেক্টরিগুলি সরিয়ে ফেলব?


51

এই প্রশ্নটি আমি এখানে পোস্ট করা প্রথম প্রশ্নের দ্বিতীয় ধাপের ধরণের

আমার একটি ডিরেক্টরি আছে যা উপ-ডিরেক্টরিগুলির একটি গুচ্ছ, .zip ফাইল এবং অন্যান্য এলোমেলো ফাইলগুলিকে একটি উপ-ডিরেক্টরিতে অন্তর্ভুক্ত করে না।

আমি একটি কমান্ড লাইন স্ক্রিপ্ট চাই যে প্যারেন্ট ডিরেক্টরিগুলির মধ্যে থেকে সমস্ত উপ-ডিরেক্টরিগুলি সরিয়ে ফেলা যায় তবে সমস্ত জিপ ফাইল এবং আলগা ফাইলগুলি কোনও সাব ডিরেক্টরিতে অন্তর্ভুক্ত না করে রাখুন। সমস্ত সাব-ডিরেক্টরিতে কন্টেন্ট থাকে তাই আমি বিশ্বাস করি আমাকে -f কমান্ড দিয়ে তাদের মুছতে বাধ্য করতে হবে।

সুতরাং মূলত, একটি কমান্ড যা প্যারেন্ট ডিরেক্টরি (বা বর্তমান ডিরেক্টরি) এর ভিতরে দেখায়, এর মধ্যে থেকে সমস্ত ফোল্ডার মুছে ফেলা হয়, তবে অন্য সমস্ত সামগ্রী এবং ফাইলগুলিকে ফোল্ডার নয় বা কোনও ফোল্ডারের মধ্যে রাখে।

আমি বুঝতে পারি যে কমান্ড লাইন থেকে আইটেমগুলি মুছে ফেলার জন্য বিশেষ যত্নের প্রয়োজন, তবে আমি দূরবর্তী অবস্থান থেকে ব্যাক আপ নিতে ইতিমধ্যে সমস্ত প্রয়োজনীয় সতর্কতা অবলম্বন করেছি।

উত্তর:


61

বেসে আপনি পেছনের স্ল্যাশ ব্যবহার করতে পারেন (আমার মনে হয় এটি কোনও পসিক্স শেলটিতে কাজ করা উচিত):

rm -R -- */

নোটগুলি --যা বিকল্পগুলি আর্গুমেন্ট থেকে পৃথক করে এবং হাইফেন দিয়ে শুরু হওয়া এন্ট্রিগুলি সরাতে দেয় - অন্যথায় শেল দ্বারা প্রসারিত হওয়ার পরে প্রবেশের নামটি একটি বিকল্প হিসাবে ব্যাখ্যা করা হবে rm(অন্যান্য অনেক কমান্ড লাইনের ইউটিলিটিগুলির জন্য এটি একই)।

-fঅ-লিখনযোগ্য ফাইলগুলি মোছার সময় আপনি যদি নিশ্চিতকরণের জন্য অনুরোধ না করতে চান তবে বিকল্পটি যুক্ত করুন ।

নোট করুন যে ডিফল্টরূপে, লুকানো ডিরেক্টরিগুলি (যাদের নাম দিয়ে শুরু হয় .) একা থাকবে।

একটি গুরুত্বপূর্ণ সতর্কতা: প্রসারণে */এমন সিমলিংক অন্তর্ভুক্ত থাকবে যা শেষ পর্যন্ত টাইপ ডিরেক্টরিগুলির ফাইলগুলিতে সমাধান করে । এবং rmবাস্তবায়নের উপর নির্ভর করে rm -R -- thelink/হয় হয় কেবল সিমলিংক মুছে ফেলবে, বা (তাদের বেশিরভাগের মধ্যে) লিঙ্কযুক্ত ডিরেক্টরিটির বিষয়বস্তু পুনরাবৃত্তভাবে মুছে ফেলবে কিন্তু সেই ডিরেক্টরিটি নিজেই বা সিমলিংকটি নয়।

যদি ব্যবহার zshকরা হয় তবে কেবলমাত্র টাইপ ডিরেক্টরীগুলির ফাইলগুলি বেছে নিতে গ্লোব কোয়ালিফায়ার ব্যবহার করা আরও ভাল পদ্ধতির হবে :

rm -R -- *(/) # or *(D/) to include hidden ones

বা:

rm -R -- *(-/)

ডিরেক্টরিগুলিতে প্রতিলিঙ্কগুলি অন্তর্ভুক্ত করতে (তবে কারণ, এই /প্রসারণটির পিছনে এস নেই, এটি কেবলমাত্র সমস্ত rmবাস্তবায়ন দিয়ে সরিয়ে দেওয়া সিমলিংক )।

সঙ্গে bash, যেমন AT & T ksh, yashবা zshআপনি কি করতে পারেন:

set -- */
rm -R -- "${@%/}"

পিছনে ফালা /


সুন্দর! এটি পুরোপুরি কাজ করে। আমি বুঝতে পারিনি যে এটি করা এত সহজ। -আর বনাম -আর সম্পর্কে বিশদ বিবরণ দিতে এবং সেই আদেশগুলি কী করবে আপনার মনে হবে? অনেক ধন্যবাদ.
ইভাস্টার

-r, -R, --recursiveযার অর্থ "যাও recursively ডিরেক্টরি এবং তাদের বিষয়বস্তু অপসারণ" প্রতিশব্দের হয়।
পিটার্ফ

আপনি কি ব্যাখ্যা করতে পারেন - এবং * / কর?
উভচর

6
আপনি এটিও বলতে পারেন rm -R ./*/- এটি হাইফেন নামের সমস্যাগুলিও এড়িয়ে চলে।
l0b0

1
* এবং / এর ক্রম পরিবর্তন না করার জন্য কেবল সাবধান হন। rm -R - / * সম্পূর্ণ ভিন্ন কিছু করে যা আপনি হতে চান না: |
ক্রিসঅডনি

13

ওয়াইল্ডকার্ড উপায় ছাড়াও, আপনি এটি করতে find(কমপক্ষে জিএনইউ অনুসন্ধান) ব্যবহার করতে পারেন :

find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 rm -R

অন্যান্য findলাইনের মত, আপনি find -mindepth 1 -maxdepth 1 -type dমুছে ফেলা হবে এমন ডিরেক্টরিগুলির একটি তালিকা দেখতে প্রথম অংশ ( ) চালাতে পারেন ।

একটি নিরাপদ বিকল্প হল এরকম কিছু করা:

find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 mv -i -t ../to-rm
# or
mv -i -t ../to-rm */
# or
mv -i */ ../to-rm

এর মধ্যে যে কোনও ../to-rmএটি মুছে ফেলার পরিবর্তে সমস্ত স্টাফ স্থানান্তরিত করবে। আপনি যা যা চান তা যাচাই করতে পারেন, rm -Rfআপনার অবসর সময়ে সেই ডিরেক্টরি।


"সিএলআই-ট্র্যাশ বিন" এর জন্য +1 to-rmএবং findযেগুলি বিন্দু দিয়ে শুরু করে ডিরেক্টরিগুলি পরিচালনা করে (অন্য কোনও জটিল অসুস্থতা ছাড়াও)। :)
পিটারফ

ভকভগক. মুছে ফেলার আগে একটি পৃথক ডিরেক্টরিতে যাওয়ার ধারণাটি আমি পছন্দ করি। আমি ম্যাক ওএস এক্স-এ টার্মিনালের মাধ্যমে কাজ করছি, এবং আমি বিশ্বাস করি যে -মাইন্ডপথ এবং -ম্যাক্সডেপথ কমান্ডগুলি সঠিকভাবে ব্যবহার করতে আমার কোনও প্রকার জিএনইউ প্যাকেজ ইনস্টল করা দরকার?
ইভস্টার

ম্যাক ওএস এক্স এর সমর্থন করে কিনা এভিস্টার নিশ্চিত হন না @ আমি অনুমান করব যে ফিঙ্ক (এটি এখনও প্রায়?) এমন কোনও ইনস্টল ইনস্টল করতে পারে। অথবা আপনি এগুলি বাদ দিতে পারেন এবং তারপরে গ্রেপ ব্যবহার করে উত্পাদিত ফাইল তালিকা ফিল্টার করতে পারেন। অবশ্যই এতে এমভি বিকল্পটি ব্যবহার করুন, আরএমের স্থিতিস্থাপক।
ডারোবার্ট

4

আপনি এই পরামর্শগুলির জন্য কিছুগুলির জন্য একটি স্ক্রিপ্ট তৈরি করতে চাইতে পারেন, বিশেষত rm -R -- */, এবং এটি আপনার / usr / স্থানীয় / বিন ফোল্ডারে রেখে দিতে পারেন; বা aliasআপনার। / .bashrc ফাইলটিতে একটি তৈরি করুন। যেহেতু কমান্ডটি ভুল করে বলা এবং আপনার সিস্টেমটি ভঙ্গ করা এত সহজ - এমনকি একটি একক চিঠি এবং / অথবা চিঠির ক্রম বিপর্যয়কর পরিণতি হতে পারে - এটি বিভিন্ন বিকল্প এবং যুক্তি টাইপ করার চেয়ে কিছুটা দৃ rob় সমাধান হিসাবে কাজ করবে would প্রতিবার আপনি এই কাজটি সম্পাদন করতে চান।

এছাড়াও, আপনি আপনার স্ক্রিপ্ট / কমান্ডের মধ্যে -i or --interactive=onceবা -I or --interactive=alwaysবিকল্পটি অন্তর্ভুক্ত করতে চাইতে পারেন যা অনিচ্ছাকৃত মোছা এড়ানোর জন্য অন্য সরঞ্জাম হিসাবে কাজ করবে।

তদ্ব্যতীত, ডারোবার্টের মতো কিছু প্রস্তাব দেওয়া ভাল; কেবল কোনও ফাইল / টার্মিনাল-সম্পাদকটিতে স্ক্রিপ্টটি অনুলিপি / আটকান এবং এটিকে আপনার নির্দিষ্ট প্রয়োজনীয়তার সাথে সামঞ্জস্য করুন এবং ফাইলগুলি / ডিরেক্টরিগুলি একটি একক ডিরেক্টরিতে স্থানান্তরিত করা হবে (যে বিষয়বস্তুগুলির মধ্যে আপনি চেক / যাচাই করতে পারেন) যা আপনি সহজেই মুছে ফেলতে পারবেন rm -rfকমান্ড জারি করা ।

অন্য বিকল্পটি হ'ল একটি জিইউআই-অ্যাপ্লিকেশন যেমন আপনার ফাইল ম্যানেজার ব্যবহার করা এবং আপনি মুছতে চান এমন সমস্ত প্রযোজ্য ফাইল / ফোল্ডারগুলি কেবল নির্বাচন করুন। আপনার কাছে অনুমতি না থাকলে আপনার বিতরণের ম্যানুয়াল-পৃষ্ঠাগুলি পরীক্ষা করুন।

অবশেষে, যদি ফোল্ডারগুলি ফাঁকা থাকে - মূলত সরল ফাইলের নাম - তবে আপনি rmdirসেগুলি মুছতে কমান্ডটি ব্যবহার করতে পারেন । আপনি মুছতে পারেন এমন সমস্ত কিছুর জন্য এটি কাজ করে না, তবে আপনি যখন কিছু "ঘর পরিষ্কার" করতে চান তখন এটি কার্যকর হবে want ** আপনি -p --ignore-fail-on-non-emptyবিকল্পটি দেখতে চাইতে পারেন , যা আপনাকে নির্দিষ্ট উপ-ডিরেক্টরি পাশাপাশি তাদের খালি "পিতামাতা" - যে ডিরেক্টরিতে তারা বাস করে তা মুছতে দেয়।


এই কমান্ডের জন্য আমি কল করতে পারি এমন একটি পৃথক স্ক্রিপ্ট তৈরি করার পক্ষে এটি সত্যিই ভাল ধারণা। -আই এবং -আই বিকল্পগুলি ঠিক কী করতে পারে তা আপনি ব্যাখ্যা করতে পারেন? ধন্যবাদ!
ইভস্টার

-আপনি আপনাকে "এন্টার" চাপার পরে আপনি এটি মুছে ফেলতে চান তা নিশ্চিত করার জন্য একবার অনুরোধ করবে (যখন সেখানে 3 টিরও বেশি ফাইল / ফোল্ডার "নির্বাচিত" রয়েছে); যদিও -i বিকল্পটি প্রতিটি ফাইলের জন্য একটি প্রম্পট জারি করবে, যার উপর আপনি কেবল "y" এবং "এন্টার" এ আলতো চাপ দিয়ে নিশ্চিত করতে পারবেন - একটি ইতিবাচক প্রতিক্রিয়া ছাড়াও যে নির্দিষ্ট ফাইলটি অপসারণের প্রক্রিয়া চলাকালীন বাদ দেওয়া হবে।
ILMostro_7

1

প্রথমে আপনাকে ডিরেক্টরিগুলি তালিকাভুক্ত করতে হবে এবং তারপরে সাধারণ ফাইলগুলিকে বাধা না দিয়ে সেগুলি সরিয়ে ফেলতে হবে, ls -d * /, কেবলমাত্র সাব-ডিরেক্টরিগুলি তালিকাভুক্ত করে, এবং rm দিয়ে পাইপ করা ডিরেক্টরিগুলি এবং বিষয়বস্তুগুলি সরিয়ে দেয়, আলগা ফাইল অক্ষত রেখে দেয়।

এই আদেশটি কাজটি করা উচিত,

ls -d  */ | xargs rm -rf

1
কি লাভ হবে rm -rf -- */? আরগের তালিকা তৈরির জন্য printf '%s\0' */ | xargs -r0 rm -rf --শেলগুলিতে ( printfঅন্তর্নির্মিত এবং না নির্মিত ls) সাহায্য করবে খুব বড় ত্রুটিগুলির তালিকা তৈরি করে , তবে ls -d */ | xargs rm -rfঅতিরিক্ত সমস্যা ব্যতীত এএএএফসিটি কিছুই যোগ করে না।
স্টাফেন চেজেলাস

1
@ অ্যান্থনি জিওগেন, হ্যাঁ উদাহরণস্বরূপ যদি কোনও " .."স্থান (স্পেস ..) নামে পরিচিত তবে এটি কিছু lsবাস্তবায়ন সহ পিতামহিত ডিরেক্টরিতে থাকা সামগ্রীকে সরিয়ে ফেলবে । এবং এটি কেবল ফাঁকা স্থান নয়, এটি অন্যান্য ফাঁকা অক্ষর, নিউলাইন, একক উদ্ধৃতি, ডাবল উদ্ধৃতি, ব্যাকস্ল্যাশ এবং ফাইলের নামগুলি দিয়ে শুরু হয় -
স্টাফেন চেজেলাস

2
@ অংকিত, আপনি মাইকিউইউ.ইউজলজিআর.এ. / পার্সিংএল দিয়ে শুরু করতে পারেন
স্টাফেন

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

1
ব্যবহার xargsগৃহীত উত্তর উপর একটি সুবিধা আছে (এটি কাজ করে যখন সেখানে ফাইলের / বর্তমান ডিরেক্টরির মধ্যে ডিরেক্টরি একটি খুব বড় সংখ্যা) তাই একটি দরকারী উত্তর এই সম্পাদনা করার জন্য সুযোগ আছে। ব্যক্তিগতভাবে, আমি স্ট্যাক এক্সচেঞ্জের প্রশ্নের উত্তরগুলি একটি ভাল শিক্ষার অভিজ্ঞতা হিসাবে খুঁজে পেয়েছি - বিশেষত যখন আমি অন্য ব্যবহারকারীদের কাছ থেকে দরকারী ফিড-ব্যাক পাই।
অ্যান্টনি জি - মনিকার পক্ষে

-1

rm -rf <directory name>। এটা কাজ করে। কেবল টাইপিংয়ের rm <directory name>ফলে কেবলমাত্র সাব প্রশ্নগুলির সংখ্যা তৈরি হয় যার মধ্যে সাব ডিরেক্টরিগুলির প্রত্যেকটিকে ম্যানুয়ালি অপসারণ করতে হবে। তবে, rm -rfএকবারে এটির উপ ডিরেক্টরিগুলি সহ পুরো ডিরেক্টরিটি সরিয়ে ফেলতে সহায়তা করে।


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