তাদের নাম দিয়ে ফাইল এবং ডিরেক্টরি মুছুন। অনুরূপ কোন ফাইল বা ডিরেক্টরি নেই


32

আমার সমস্ত সংকলিত ডেটা মুছতে হবে:

  • ডিরেক্টরি বলা হয় build,
  • ডিরেক্টরি বলা হয় obj,
  • * .so ফাইল

আমি একটি আদেশ লিখেছি

find \( -name build -o -name obj -o -name *.so \) -exec rm -rf {} \;

এটি সমস্ত ডিরেক্টরিকে পুনরাবৃত্তভাবে যায় এবং আমার যা প্রয়োজন তা মুছে দেয়।

কেন আমার শেষে এমন আউটপুট থাকে? হয়তো আমার আলাদা কমান্ড লেখা উচিত।

find: `./3/obj': No such file or directory
find: `./3/build': No such file or directory
find: `./1/obj': No such file or directory
find: `./1/build': No such file or directory
find: `./2/obj': No such file or directory
find: `./2/build': No such file or directory

আপনি কোন সিস্টেমে আছেন? আপনার সর্বদা findএই find /search_directory optionsজাতীয় অনুসন্ধান ডিরেক্টরি বাদ দেওয়ার মতো ব্যবহার করা ভাল ধারণা নয়
কিউই

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

@ কিউই, @ ফাহিমমিঠা, কমান্ডটি কেবলমাত্র প্রকল্পের নির্দেশনায় ব্যবহৃত হবে; এটি সেখানে কোনও ক্ষতি করবে না।
মাকসিম দিমিত্রিভ

উত্তর:


54

ব্যবহারের -pruneডিরেক্টরি যে তোমাকে বলতে যাহাই হউক না কেন মুছে ফেলতে যাচ্ছেন করছেন findতাদের মধ্যে ফাইল খুঁজে বের করার চেষ্টা বিরক্ত করার জন্য না:

find . \( -name build -o -name obj -o -name '*.so' \) -prune -exec rm -rf {} +

এছাড়াও নোট করুন যে *.soহিসাবে উদ্ধৃত করা প্রয়োজন অন্যথায় এটি শেল দ্বারা .soবর্তমান ডিরেক্টরিতে ফাইলের তালিকায় প্রসারিত হতে পারে ।

আপনার জিএনইউ- -regexটাইপটির সমতুল্য হ'ল:

find . \( -name build -o -name obj -o -name '*?.so' \) -prune -exec rm -rf {} +

মনে রাখবেন যে আপনি যদি জিএনইউ নির্দিষ্ট সিনট্যাক্স ব্যবহার করতে চলেছেন তবে এর -deleteপরিবর্তে আপনি সম্ভবত ব্যবহার করতে পারেন -exec rm -rf {} +। এর সাথে -delete, জিএনইউ স্বয়ংক্রিয়ভাবে findচালু -depthহয়। এটি বাহ্যিক কমান্ডগুলিকে সেভাবে চালায় না, এটি আরও কার্যকর এবং এটি আরও নিরাপদ কারণ এটি রেসের অবস্থাটিকে সরিয়ে দেয় যেখানে কেউ আপনাকে সময়ের মধ্যে সিমিলেঙ্কে ডিরেক্টরি পরিবর্তন করে ভুল ফাইলগুলি সরিয়ে দিতে সক্ষম হতে পারে findএকটি ফাইল সন্ধান করে এবং rmএটি সরিয়ে দেয় ( info -f find -n 'Security Considerations for find'বিশদগুলির জন্য দেখুন)।

find . -regextype posix-egrep -regex '.*/((obj|build)(/.*)?|.+\.so)' -delete

-deleteস্পেসের মতো জিনিসগুলি আরও ভালভাবে পরিচালনা করে
ইজকাটা

@ ইজকাটা, এর চেয়ে ভাল নয় -exec rm -rf {} +যার সাথে ইস্যু হয় না।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস - আমি সম্পর্কে বিভ্রান্ত {}- তাদের উদ্ধৃতি দেওয়া উচিত কি না? এটি উদ্ধৃতিবিহীন কাজ করে বলে মনে হচ্ছে, তবে GNU Findutils ম্যানুয়াল'{}' উদাহরণ হিসাবে ব্যবহার করে। তুমি কি পরিষ্কার করে বলতে পারো?
গ্রেবনেকে

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

3
এবং -deleteডিরেক্টরি সহ ব্যবহার করা যাবে না।
St0rM

8

আমি অনুমান করার কারণটি হ'ল findপ্রথমে ডিরেক্টরি ট্রিটি মুছে ফেলা হয় এবং ডিরেক্টরি সামগ্রীর চেক করার চেষ্টা করে যা সম্ভবত সর্বোত্তম সম্ভাব্য ক্রম নয়। আপনি findপ্রথমে সামগ্রীগুলি পরীক্ষা করতে বাধ্য করতে পারেন :

find . -depth ...

আপনার -deleteফাইল এবং -exec rmdirডিরেক্টরি ব্যবহারের জন্য বিবেচনা করা উচিত ।


0

আমার সমাধান।

find . -regextype posix-egrep -regex ".*/(obj|build|.+\.so)" -prune -exec rm -rf {} +

+ বনাম \; -exec কমান্ডে


এটি সর্বদা কাজ করে না, কেবলমাত্র মুছে ফেলা ডিরেক্টরিটির মধ্যে মৃত্যুদন্ড কার্যকর করার মধ্যে কোনও সীমানা না ঘটে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ গিলস, "মৃত্যুদণ্ড কার্যকর করার মধ্যে সীমানা" বলতে কী বোঝায়?
মাকসিম দিমিত্রিভ

1
-exec … {} +একসাথে একাধিক ফাইলের জন্য কমান্ড কার্যকর করে, যতগুলি কমান্ড লাইনে ফিট হয়। যদি খুব বেশি ফাইল থাকে (বা আরও সঠিকভাবে যদি পাথগুলির মোট দৈর্ঘ্য খুব দীর্ঘ হয়) তবে এর findএকাধিক উদাহরণ কার্যকর করা হবে rmএবং এর ফলে এটি যে ডিরেক্টরিটি অনুসরণ করছে তা সরিয়ে ফেলতে পারে। এটির +তুলনায় এটির সম্ভাবনা কম ;, তবে +সমস্যার সমাধান হয় না।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.