আমি কীভাবে ওয়াইল্ডকার্ড দিয়ে পুনরাবৃত্তভাবে ডিরেক্টরিগুলি মুছব?


51

আমি ডাব্লুডি আমার বইয়ের বিশ্ব সংস্করণে এসএসএইচের মাধ্যমে কাজ করছি। মূলত আমি একটি নির্দিষ্ট ডিরেক্টরি স্তরে শুরু করতে চাই এবং পুনরাবৃত্তভাবে সমস্ত উপ ডিরেক্টরি ডিরেক্টরি মিলে ফেলতে চাই .Apple*। আমি কিভাবে এটি সম্পর্কে যেতে হবে?

আমি চেষ্টা করেছিলাম

rm -rf .Apple* এবং rm -fR .Apple*

উপ-ডিরেক্টরিগুলির মধ্যে এই নামের সাথে মিলে যাওয়া ডিরেক্টরিগুলিও মুছে ফেলা হয়নি।

উত্তর:


73

find নির্বাচিতভাবে পুরো গাছে ক্রিয়া সম্পাদনের জন্য খুব দরকারী।

find . -type f -name ".Apple*" -delete

এখানে, এটি -type fনিশ্চিত করে যে এটি কোনও ফাইল নয়, একটি ডিরেক্টরি নয় এবং আপনি যা চান ঠিক তা নাও হতে পারে কারণ এটি সিমলিংক, সকেট এবং অন্যান্য জিনিসগুলিও এড়িয়ে যাবে। আপনি ব্যবহার করতে পারেন ! -type d, যার আক্ষরিক অর্থ ডিরেক্টরি নয়, তবে আপনি অক্ষর এবং ব্লক ডিভাইসগুলিও মুছতে পারেন। আমি -typeম্যান পৃষ্ঠায় শিকারের দিকে তাকানোর পরামর্শ দেব find

একটি ওয়াইল্ডকার্ড দিয়ে কঠোরভাবে এটি করতে আপনার উন্নত শেল সমর্থন প্রয়োজন। বাশ ভি 4-র globstarবিকল্প রয়েছে , যা আপনাকে পুনরাবৃত্তভাবে সাব-ডাইরেক্টরিগুলি ব্যবহার করে মেলতে দেয় **zshএবং kshএই প্যাটার্ন সমর্থন। যে ব্যবহার করে, আপনি করতে পারেন rm -rf **/.Apple*। এটি পসিক্স-স্ট্যান্ডার্ড নয় এবং খুব পোর্টেবলও নয়, তাই আমি এটিকে স্ক্রিপ্টে ব্যবহার করা এড়াতে পারি, তবে এক সময়ের আন্তঃ ইন্টারেক্টিভ শেল অ্যাকশনের জন্য, এটি ঠিক আছে।


3
আমি find . -type d -name .Apple*কাজ করতে পারি - এটি সমস্ত ফোল্ডার তালিকাভুক্ত করে। যাইহোক, আমি -deleteশেষে যুক্ত করলে এটি ব্যর্থ হয় । এটি কেবল ব্যবহারের সংক্ষিপ্তসার সহ ফিরে আসে। এটি ব্যাসিবক্স v1.1.1 এ চলছে। এটা কি কোন পার্থক্য তৈরি করবে?
কোডেডোগ

1
-deleteপসিক্স হয় না। 90 এর দশকের গোড়ার দিকে **চালু হয়েছিল zsh। এটি এখন (চেহারা কাল্পনিক ক্রম অনুসারে) ksh93, ফিশ, বাশ এবং টিসিএইচেও রয়েছে।
স্টাফেন চেজেলাস

1
+1 এর জন্যrm -rf **/.Apple*
অ্যান্ড্রি বয়কো

1
@ কোডেডোগ, পরিবর্তে যদি -deleteকাজ না -exec rm -f {} +করে।
ওয়াইল্ডকার্ড

1
আপনি পেতে পারেন findযেমন মুছে ফেলে বাগাড়ম্বরপূর্ণ হতে? আমি মনে করি "গ্লোবস্টার" পদ্ধতিটি -vসুইচটি যুক্ত করে এটি করবে ।
ডেমিস

16

আমি ব্যবহার সমস্যায় দৌড়ে findসঙ্গে -deleteইচ্ছাকৃত আচরণের কারণে findযেমন সংশ্লিষ্ট man পৃষ্ঠা বিবৃত (অর্থাত যদি পথ ./, যা তারা আমার ক্ষেত্রে কি দিয়ে শুরু হয় মুছে ফেলতে অস্বীকার):

 -delete

পাওয়া ফাইল এবং / অথবা ডিরেক্টরি মুছুন। সর্বদা সত্য ফিরে আসে। এটি গাছের নীচে পুনরাবৃত্তি হিসাবে এটি বর্তমান কার্যকারী ডিরেক্টরি থেকে কার্যকর করে। এটি "/" বর্ণের সাথে সম্পর্কিত তার নামের সাথে "/" অক্ষরযুক্ত ফাইলের নাম মুছতে চেষ্টা করবে না। " নিরাপত্তার কারণে.
গভীরতা-প্রথম ট্র্যাভারসাল প্রক্রিয়াজাতকরণ এই বিকল্প দ্বারা আবদ্ধ।
নিম্নলিখিত চিহ্নগুলি এই বিকল্পের সাথে বেমানান।

পরিবর্তে, আমি ঠিক করতে সক্ষম হয়েছি

find . -type d -name 'received_*_output' -exec rm -r {} +

আপনার ক্ষেত্রে, দেখে মনে হচ্ছে যে গ্লোবকে উদ্ধৃত করা (অ্যাসিরিস্টক, *) সমাধান ছিল, তবে অন্য কারও ক্ষেত্রেও একইরকম সমস্যা হলে আমি আমার উত্তর সরবরাহ করতে চেয়েছিলাম।

দ্রষ্টব্য: পূর্বে, আমার উত্তরটি নিম্নলিখিতটি করা ছিল, কিন্তু @ উইল্ডকার্ড মন্তব্যগুলিতে তা করার ক্ষেত্রে সুরক্ষার ত্রুটিগুলি নির্দেশ করেছেন।

find . -type d -name 'received_*_output' | xargs rm -r

1
xargsএখানে ব্যবহার করার কোনও ভাল কারণ নেই । -exec rm -r {} \;বা, আরও ভাল, -exec rm -r {} +বিশেষ অক্ষরের ফাইলের নাম ব্যর্থ না করে পাশাপাশি কাজ করবে। দেখুন কেন অনুসন্ধানের আউটপুটটি খারাপ অনুশীলনকে ফাঁপা করছে?
ওয়াইল্ডকার্ড

এটা জানা ভাল. আইএমও একটি ডাউনটাউটের পক্ষে মূল্যবান নয়, যেহেতু কমান্ডটি এখনও কাজটি করে, তবে পারফরম্যান্স অপটিমাইজেশন প্রশংসিত হয়।
পট

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

mkdir -p $'blah\nDocuments\n/etc\n/home\n/received__output'আপনার ডিরেক্টরিতে চেষ্টা করুন এবং তারপরে আবার একই কমান্ডটি চালান, যদি আপনি বিশ্বাস না করেন যে ডেটা ক্ষতির সম্ভাবনা রয়েছে। বা, যেহেতু প্রশ্নটি ম্যাক ওএস সম্পর্কিত mkdir -p $'blah\nDocuments\n/Users\n/Applications\n/received__output'। ( সতর্কতা: আপনি যদি এটি করেন তবে আপনি আপনার সমস্ত ফাইল মুছবেন That's এটা আমার বক্তব্যের মতো))
ওয়াইল্ডকার্ড

0

যা সম্ভব তা হ'ল আপনার আরএম / ফাইন্ড কমান্ডের সাথে কোনও ভুল নেই, তবে আপনি যে ব্যবহারকারীর সাথে লগ ইন করেছেন তার আসলে মুছার অনুমতিগুলি নেই। ls -lজিনিসগুলির অনুমতি নিয়ে তালিকাভুক্ত করার জন্য ব্যবহার করুন এবং আপনি কমান্ড idএবং groupsকমান্ডের সাথে আছেন তা সনাক্ত করতে পারবেন (হয় উপলভ্য হওয়া উচিত)। আপনি যদি এটি করতে "ভুল ব্যবহারকারী" হন তবে আপনাকে ফাইলগুলির অনুমতি / মালিকানা পরিবর্তন করতে হবে বা অন্য কোনও ব্যবহারকারীর কাছে যেতে হবে।



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