`Find` আউটপুটের ভিত্তিতে ডিরেক্টরিগুলি কীভাবে মুছবেন?


148

.Svn ডিরেক্টরিগুলি অনুসন্ধান করার জন্য আমি নিম্নলিখিত কমান্ডটি জারি করি:

find . -name ".svn"

এটি আমাকে নিম্নলিখিত ফলাফল দেয়:

./toto/.svn
./toto/titi/.svn
./toto/tata/.svn

rm -frডিরেক্টরিগুলি এবং তাদের বিষয়বস্তু মুছতে আমি কীভাবে এই সমস্ত লাইনটি প্রক্রিয়া করতে পারি ?


3
জিএনইউ অনুসন্ধানের -deleteবিকল্প রয়েছে।
মার্কো

5
অথবা আপনি -exec rm -r "{}" \;অনুসন্ধানের শেষে যুক্ত করতে পারেন - ব্যবহারের সময় সতর্কতা অবলম্বন করুন rm -r! :)
ড্র স্লান

10
@ মার্কো মুছুন অপশনটি ডিরেক্টরিতে কাজ করে না বলে মনে হয়।
আর্নাউড

@ সুপারচাফুইন এটি ফাইল এবং ডিরেক্টরিতে এখানে পুরোপুরি ভাল কাজ করে। মুল বক্তব্যটি হ'ল এটি কেবলমাত্র এমটিপি ডিরেক্টরিগুলি মুছে দেয় এবং আপনি যখন -name ".svn"এটি নির্দিষ্ট করেন কেবল .svnডিরেক্টরিটি নিজেই মেলে এবং ডিরেক্টরিতে থাকা ফাইলগুলির সাথে নয় .svn
মার্কো

1
@ সুপারচাফুইন কিন্তু সেগুলিতে ফাঁকা স্থানগুলির জন্য পথের জন্য কাজ করবে না (তাই -execউদ্ধৃত সহ ব্যবহার করে "{}")।
ড্রইন স্লোয়ান

উত্তর:


194

-execএটি অনুসন্ধান করে প্রতিটি মিলের জন্য বিকল্পের সাথে যুক্তিগুলি কার্যকর করতে পারে Find এটি একটি প্রস্তাবিত প্রক্রিয়া কারণ আপনি স্পেস / নিউলাইন এবং অন্যান্য অক্ষরগুলির সাথে সঠিকভাবে পাথগুলি পরিচালনা করতে পারেন। ডিরেক্টরি নিজেই মুছে ফেলার আগে আপনাকে ডিরেক্টরিটির বিষয়বস্তু মুছতে হবে, সুতরাং -rএটি rmঅর্জনের জন্য কমান্ডটি ব্যবহার করুন ।

আপনার উদাহরণের জন্য আপনি ইস্যু করতে পারেন:

find . -name ".svn" -exec rm -r "{}" \;

আপনি কেবল চেক যোগ করে .svn নামের ডিরেক্টরিগুলি অনুসন্ধান করতেও বলতে পারেন -type d:

find . -name ".svn" -type d -exec rm -r "{}" \;

rm -rসতর্কতার সাথে সতর্কতা ব্যবহারের ফলে এটি ফোল্ডার এবং এর সমস্ত সামগ্রী মুছে ফেলবে।

আপনি যদি কেবল খালি ডিরেক্টরি পাশাপাশি কেবল খালি ডিরেক্টরিগুলি অন্তর্ভুক্ত করে এমন ডিরেক্টরিগুলিও মুছতে চান তবে এটি নিজেই -deleteএবং এটির মাধ্যমে করতে পারেন -empty:

find . -name ".svn" -type d -empty -delete

21
আমি সবসময় চালানোর পরামর্শ দেখেছি -type পর -name খোঁজ কমান্ড এ, কল থেকে statটাইপ পেতে ব্যয়বহুল। আমি এটি বেশ কয়েকটি বড় ফাইলের মধ্যে নিজেই চেষ্টা করে দেখেছি এবং এটি সত্য বলে মনে হচ্ছে: দৌড়াতে find . -name 'foo' -type d19 সেকেন্ড সময় find . -type d -name 'foo'লেগেছে, 32 সেকেন্ড সময় নিয়েছে। সুতরাং -typeপ্রথম চালানোর জন্য প্রায় 50% দীর্ঘ সময় ।
স্পিনআপ

6
আমি এই কমান্ডটি বছরের পর বছর ধরে ব্যবহার করে আসছি, তবে ম্যাকে এখন আমি ত্রুটি পেয়েছি যে ডিরেক্টরিগুলি বিদ্যমান নেই। যদিও এটি তাদের মুছে দেয়। আমি এর আগে কখনও বার্তা দেখিনি।
chovy

1
@ Chovy হিসাবে একই। এই বার্তাগুলি থেকে মুক্তি পাওয়ার কোনও উপায় আছে কি?
ক্লাইমেন্ট

2
@ chovy @ clément কারণ findএটি একই সাথে ফোল্ডারটি অপসারণ করার সময় অন্যান্য ম্যাচের জন্য সেই ফোল্ডারে দেখতে চায়। This কীভাবে এটি ঠিক করতে হবে তা আমি এখনও জানি না ~ ডার্টি ফিক্স:find . -name "folder-to-delete" -print0 | xargs -r0 -- rm -r
চার্লি

5
@ ছোভি @ ক্লিমেট আমার মনে হয় -depthযুক্তিটি find . -depth -name ".svn" -type d -exec rm -r "{}" \;
এইটিকে

67

এখানে গৃহীত উত্তর পদ্ধতির চেয়ে এখনও একটি পোর্টেবল faster

একটি ব্যবহার +হিসাবে একটি সেমিকোলন পরিবর্তে findকমান্ড টারমিনেটর CPU ব্যবহার নিখুঁত করা হয়। আপনার কাছে প্রচুর .svnউপ-ডিরেক্টরি থাকলে তা তাৎপর্যপূর্ণ হতে পারে :

find . -name .svn -type d -exec rm -rf {} +

এছাড়াও নোট করুন যে আপনার এখানে 1 টি কোঁকড়া ধনুর্বন্ধনী উদ্ধৃত করার প্রয়োজন নেই।

1 যদি আপনি fishশেলটি ব্যবহার না করেন ।


5
+ এবং সেমিকোলনের মধ্যে পার্থক্য কী? কেন আমরা কোঁকড়া ধনুর্বন্ধনী ব্যবহার করি না?
শিচেং গুও

1
@ শিচেনগুও সেমিকোলনের সাথে, প্রতিটি ডিরেক্টরি অনুসারে একটি আরএম কমান্ড পাওয়া যাবে, + একটি একক আরএম কমান্ডের সাহায্যে পাওয়া সমস্ত ডিরেক্টরি (বা তাদের মধ্যে কমপক্ষে একটি খুব বড় সংখ্যক) প্রক্রিয়াকরণ করবে আমি আপনার দ্বিতীয় প্রশ্ন, কোঁকড়া পেতে পারি না ধনুর্বন্ধনী এখানে ব্যবহার করা হয়।
jlliagre

আমি মনে করি @ শিচেংগু এর অর্থ এখানে কেন কোঁকড়া ধনুর্বন্ধনী উদ্ধৃত করার দরকার নেই (@ জেলিয়াগ্রে লিখেছেন যে আমাদের কখনই সেগুলি উদ্ধৃত করার দরকার নেই)। আমি এখনই একটি তথ্য খুঁজে পাচ্ছি না, তবে আমি এটি বুঝতে পারি কারণ অনুসন্ধানগুলি স্বয়ংক্রিয়ভাবে {} এর জন্য প্রতিস্থাপিত পথগুলি থেকে পালিয়ে যাবে}
কুইন কমেন্ডেন্ট

উত্তর এবং প্রশ্নটি + কি করে ঠিক তা সঠিক নয়। যদি অনেক ফাইল পাওয়া যায় তবে ';' 'কমান্ড লাইন খুব দীর্ঘ' ত্রুটি দেয়। ব্যাচগুলিতে পাওয়া ফাইলগুলি বিভক্ত করে তোলে যা সর্বোচ্চ অনুমোদিত কমান্ড লাইনের দৈর্ঘ্যের চেয়ে কম এবং প্রতিটি ব্যাচের জন্য কমান্ড চালায়।
গাইঠে

1
@ কেওইথ আমি আপনার সম্পাদিত রোলব্যাক করেছি যা সঠিক বিবৃতিটিকে একটি ভুল দ্বারা প্রতিস্থাপন করেছে। ব্যবহার + করে CPU ব্যবহার কমাতে, ব্যবহার ; না কমান্ড অত্যন্ত দীর্ঘ ত্রুটি হতে।
jlliagre

27

ধরে নিন আপনি gnu ফাইন্ড ব্যবহার করছেন , আপনি -deleteবিকল্পটি ব্যবহার করতে পারেন :

find . -name test -delete

যা মনে রাখা সহজ।


কমান্ডের ব্যাখ্যা দিয়ে আপনার পোস্টকে প্রসারিত করার বিষয়ে বিবেচনা করুন (বা আপনার সমাধানটি ব্যাক আপ করার জন্য ডকুমেন্টেশন)। প্রায়শই একটি (বা দুটি) লাইন উত্তর সর্বাধিক আলোকিত হয় না।
হ্যালোগোস্ট

93
এটি খালি নয় ডিরেক্টরিতে কাজ করে না।
belacqua

2
ম্যাক ওএস এক্স
আঁকুন

এটি খালি খালি ফোল্ডারের জন্য কাজ করে না তবে এটি সহজ ও নিরাপদ সমাধান
রুসো অ্যালেক্সান্দ্রে

বিকল্পগুলির ক্রমটি অত্যন্ত গুরুত্বপূর্ণ, সন্ধান করুন যাতে সেগুলি কার্যকর করা যায়, - শেষটি হ'ল শেষ হতে হবে
জোসে ইগনাসিও সেন্টেনো

13

আমার কম্পিউটারে যখন আমি ব্যবহার করি:

find . \( -name dirname -type d \) -exec rm -r '{}' ';'

ডিরেক্টরিগুলি মুছে ফেলা হয়েছে তবে আমি ত্রুটি পেয়েছি:

find: ‘./dirname’: No such file or directory

প্রতিটি ডিরেক্টরি জন্য।

আমার ডিরেক্টরিগুলি খালি নয়, সুতরাং - মুছে ফেলা বিকল্পটি আমার পক্ষে কাজ করবে না। আমি এখানে এই আচরণের কারণটি খুঁজে পেয়েছি :

  1. ./ ডিরেক্টরিতে প্রথম এন্ট্রি লাগে (অগত্যা নয়) find এটি উদাহরণস্বরূপ dir.1 / হবে
  2. এটি এর সাথে তুলনা করে 'dir।?' এটি মিলছে? হ্যাঁ.
  3. "rm -r dir.1" নির্বাহ করা সন্ধান করুন।
  4. ডিরেক্টরিতে প্যাটার্নটি সন্ধান করতে dir.1 / প্রবেশ করার চেষ্টা করুন। এটি এক্সিকিউট কমান্ড সম্পর্কে কিছুই জানে না।
  5. এটি dir.1 / আর খুঁজে না। ENOENT ফেরত (স্ট্রেস আউটপুট দেখুন)

আমি এটি পরিবর্তে কাজ করার জন্য ব্যবহার করেছি:

rm -r `find . -name dirname -type d`

মনে রাখবেন যে অনুসন্ধানটি এখনও ডায়ারনাম নামের ডিরেক্টরিতে পুনরাবৃত্তি করার চেষ্টা করবে, যা সত্যই প্রয়োজনীয় নয় এবং কিছু অতিরিক্ত সময় লাগবে। আপনার ডিরেক্টরি কাঠামোর উপর নির্ভর করে আপনি --depthঅনুসন্ধান বিকল্পের সাহায্যে এটি ঘিরে কাজ করতে সক্ষম হতে পারেন । এছাড়াও, আপনার যদি dirname / foo / dirname এর মতো ডিরেক্টরি কাঠামো থাকে তবে আপনি আরএম থেকে "এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই" ত্রুটি পাবেন। ত্রুটিগুলি দমন করতে আপনি স্টাডারকে / dev / নাল থেকে পুনর্নির্দেশ করতে পারেন বা -fআরএম দিয়ে (বাহিনী) পতাকা ব্যবহার করতে পারেন ।


2
খারাপ ধারণা: ফাঁকা জায়গাগুলির ফাইলের নামটি সব ধরণের ভয়ঙ্কর সমস্যার কারণ ঘটবে
ক্লাইমেন্ট

2
ভবিষ্যতের পাঠকদের জন্য: find . -name "to-delete" -print0 | xargs -r0 -- rm -rএটি একটি ব্যর্থোধক সংস্করণ যা ফাঁকা স্থানগুলিতে ক্রাশ হয় না
চার্লি

3
আপনাকে যুক্ত করতে হবে unix.stackexchange.com/a/115869/8257 দেখুন -prune
ম্যাপিও

1
যোগ -prune"কোন ধরনের ফাইল অথবা ডাইরেক্টরি" ত্রুটি এড়ানো।
জুলিয়ান কারসিক

12

এটি করার একটি দ্রুত উপায় হ'ল:

find . -name ".svn" -type d -prune -exec rm -rf '{}' '+'

যদি আপনার ".svn" এর মধ্যে অন্য একটি ".svn" থাকে।


সাব-ডিরেক্টরিতে মুছে ফেলার জন্য ডিরেক্টরিগুলি সন্ধান করতে চাইলে এটি খুব কার্যকর নয়।
অ্যালেক্সিস উইল্কে

5

সুনির্দিষ্ট সমাধান:

shopt -s globstar
rm -r **/.svn
shopt -u globstar #optional. this will disable globstar expansion

3
অনেকগুলি ফাইলের সাথে মেলে গ্লোবগুলির কমান্ড লাইন বিস্তারের জন্য নোট, আপনি এই পদ্ধতির সাথে মেলে নিতে পারেন এমন ফাইলগুলির সংখ্যার সীমা রয়েছে। এই সীমাটি bash: /bin/rm: Argument list too long
ছাড়িয়ে যাওয়ার

1
@ ড্রাভস্লোয়ান সঠিক, তবে এই সীমাটি কয়েক লক্ষ ফাইলে রয়েছে। এটি মনে রাখার মতো কিছু তবে সম্ভবত বেশিরভাগ মানুষের পক্ষে সমস্যা হবে না।
অশুভপদ

4

আমি খুঁজে পেয়েছি যে -deleteক্রিয়াটি -pathপরীক্ষার সাথে দুর্দান্তভাবে কাজ করে । উদাহরণস্বরূপ, নিম্নলিখিত পোস্টার সমস্যা নিয়ে নিম্নলিখিত কাজ করা উচিত:

find . -path '*/.svn*' -delete

তুমি কি নিশ্চিত? -deleteবোঝায় -depthএবং এটি অবশ্যই আমার সিস্টেমে অ-ফাঁকা ডিরেক্টরি মুছে ফেলবে।
ম্যাগনাস

বিরক্ত এবং এটি কাজ করে। হয়তো এটি ঠিক টাইপ ছিল যা আমি সংশোধন করেছি।
কেনারব

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