কেন 'ফাইন্ড-ডিলিট' ডিরেক্টরিগুলির সমস্ত ফাইলকে পুনরাবৃত্তভাবে মুছে দেয়


15

সুতরাং ইউনিকসের নিম্নলিখিত আচরণগুলি কেবল আমার জন্য খুব ব্যয় করে:

> touch foo
> touch bar
> ls  
bar  foo
> find . -name '*oo' -delete
> ls
bar
> touch baz
> ls
bar  baz
> find . -delete -name '*ar'
> ls
> #WHAAAT?

এটি কীভাবে বোঝায়?


2
এই প্রশ্নটি সম্পর্কিত, ভবিষ্যতের পাঠকদের জন্য এটি আকর্ষণীয় হতে পারে। unix.stackexchange.com/questions/101282/…
বার্নহার্ড

উত্তর:


14

অনুসন্ধানের কমান্ড লাইনটি বিভিন্ন ধরণের অপশন থেকে তৈরি করা হয়, যা অভিব্যক্তির সাথে মিলিত হয়।

findবিকল্প -deleteএকটি কর্ম নয়।
এর অর্থ এটি এখনও পর্যন্ত মিলে যাওয়া প্রতিটি ফাইলের জন্য কার্যকর করা হয়।
পথগুলির পরে প্রথম বিকল্প হিসাবে, সমস্ত ফাইলের সাথে মিল রয়েছে ... ওফ!

এটি বিপজ্জনক - তবে ম্যান পেজটিতে কমপক্ষে একটি বড় সতর্কতা রয়েছে :

থেকে man find:

ACTIONS
    -delete
           Delete  files; true if removal succeeded.  If the removal failed, an
           error message is issued.  If -delete fails, find's exit status  will
           be nonzero (when it eventually exits).  Use of -delete automatically
           turns on the -depth option.

           Warnings: Don't forget that the find command line is evaluated as an
           expression,  so  putting  -delete first will make find try to delete
           everything below the starting points you specified.  When testing  a
           find  command  line  that  you later intend to use with -delete, you
           should explicitly specify -depth in order to avoid later  surprises.
           Because  -delete  implies -depth, you cannot usefully use -prune and
           -delete together.


আরও উপরে থেকে man find:

EXPRESSIONS
    The expression is made up of options (which affect overall operation rather
    than  the  processing  of  a  specific file, and always return true), tests
    (which return a true or false value), and actions (which have side  effects
    and  return  a  true  or false value), all separated by operators.  -and is
    assumed where the operator is omitted.

    If the expression contains no actions other than  -prune,  -print  is  per‐
    formed on all files for which the expression is true.


কোন findআদেশ কী করবে তা চেষ্টা করে :

কমান্ডটি কী পছন্দ করে তা দেখতে

find . -name '*ar' -delete

মুছে ফেলবে, আপনি প্রথমে -deleteআরও ক্ষতিকারক ক্রিয়া দ্বারা ক্রিয়াটি প্রতিস্থাপন করতে পারবেন - যেমন -flsবা -print:

find . -name '*ar' -print

এটি ফাইলগুলি ক্রিয়া দ্বারা প্রভাবিত হয় তা মুদ্রণ করবে।
এই উদাহরণে, -প্রিন্টটি বাদ দেওয়া যেতে পারে। এই ক্ষেত্রে, সেখানে এ সব পদক্ষেপ না তাই সবচেয়ে বড় পরোক্ষভাবে যোগ করা হয়: -print। (উপরে বর্ণিত "এক্সপ্রেশন" বিভাগের দ্বিতীয় অনুচ্ছেদটি দেখুন)


আমি অনুমান করি যে ম্যানুয়ালটি প্রথমে না পড়ার জন্য আমি কেবল একজন বোকা .. তবে কেবল -deleteপতাকাটি যুক্ত করা এতটা সরল মনে হয়েছিল :-) তবে এর find . -deleteচেয়ে কারও কি কখনও কারণ থাকবে rm -rf .? বা এটি কেবল findতার যুক্তিগুলি বিশ্লেষণ এবং প্রক্রিয়া করার উপায় হিসাবে ঘটে ?
এমএসজেপ

1
ওহ, আমি সম্পূর্ণরূপে সম্মত হই যে সিনট্যাক্সটি খুব বিপজ্জনক - তবে এটি এড়ানো শক্ত, কারণ এটি চূড়ান্তভাবে শক্তিশালী, অনুসন্ধানের কম্যান লাইনের প্রকাশ বাক্য সিনট্যাক্সের একটি বিশেষ ঘটনা। " একটি শক্তিশালী চেইনসো " এর মতো শক্তিশালী
ভোলকার সিগেল

উদ্ধৃত ম্যানুয়াল পৃষ্ঠাটি কী বলে warning: use -depth when testing stuff you later want to -deleteযা আপনি আপনার ব্যবহারিক দিকের উদাহরণটিতে করেন নি?
pqnet

ওহ, ঠিক - সমস্যাটি শিরোনাম - আমি একটি -nবিকল্পের মতো-মোছার জায়গায় মুদ্রণের ব্যবহার চিত্রিত করতে চাইছিলাম ; প্রথম কমান্ডের অবশ্যই কোনও ব্যবহারিক ব্যবহার করা উচিত নয়; আমি এটি পরিবর্তন করতে যাব।
ভোলকার সিগেল

9

ইন findযুক্তি অর্ডার গুরুত্বপূর্ণ, অনেক।

যুক্তিগুলি বিকল্প, পরীক্ষা এবং ক্রিয়া হতে পারে। আপনার প্রথমে প্রথমে বিকল্পগুলি ব্যবহার করা উচিত, তারপরে পরীক্ষা করুন, তারপরে ক্রিয়া করুন।

কখনও কখনও findএমনকি কোনও সম্ভাব্য খারাপ ক্রম সম্পর্কেও সতর্ক করে দেয় (উদাহরণস্বরূপ যখন আপনি -maxdepthঅন্যান্য যুক্তির পরে ব্যবহার করেন ), তবে অন্যরা মনে হয় এটি তা হয় না।

কি find . -delete -name '*ar'কি:

  1. বর্তমান ডিরেক্টরি অনুসারে ফাইল এবং ডিরেক্টরি অনুসন্ধান করে।
  2. তারা যেমন পাওয়া যায় তেমন তাদের মুছে ফেলে!
  3. তারপরে তাদের নাম '* আর' এর মতো দেওয়া হয়েছে কিনা তা দেখুন (এই অংশটির এখন কোনও প্রভাব নেই)।

আপনি সম্ভবত যা করতে চান তা হ'ল:

find -name '*ar' -delete

এটি, প্রতিটি ফাইলের জন্য এটি দেখতে মেলে '*ar'কিনা এবং কেবলমাত্র এটি শর্তটি পূরণ করলেই এটি ফাইলটি মুছে ফেলা হবে।

দুঃখিত যদি আপনি খুব দেরী খুঁজে পেয়েছি।

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