কোনও ফাইল উপস্থিত না থাকলে আমি কীভাবে আরএম কে ত্রুটি দেব না?


329

আমি একটি মেকফিল লিখছি যা সংকলনের শেষে কিছু অকেজো ফাইল সাফ করবে। যদি একটি লক্ষ্য ইতিমধ্যে তৈরি করা হয়ে থাকে তবে এটি অবশ্যই সেই লক্ষ্যটি এড়িয়ে যাবে এবং অকেজো ফাইলটি সেখানে নাও থাকতে পারে। সুতরাং আমি যদি এটি করি:

rm lexer.ml interpparse.ml interpparse.mli

আমি ত্রুটি পেতে পারি কারণ ফাইলগুলির একটির উপস্থিতি নেই। rmএই ফাইলগুলিকে উপেক্ষা করার কোনও উপায় আছে কি ?

ম্যান পৃষ্ঠাটি পড়তে, আমি নিম্নলিখিত বিকল্পটি দেখতে পাচ্ছি:

 -f          Attempt to remove the files without prompting for confirma-
             tion, regardless of the file's permissions.  If the file does
             not exist, do not display a diagnostic message or modify the
             exit status to reflect an error.  The -f option overrides any
             previous -i options.

এটি আমি যা চাই তা প্রায় শোনায় তবে অনুমতিগুলির অংশ সম্পর্কে আমি সত্যিই নিশ্চিত নই। এই কাজ করতে একটি উপায় আছে কি?


আপনি কি rmস্যান্ডবক্সে কিছু চেষ্টা করেছিলেন ? দেখে মনে হচ্ছে -fগ্লোব্বিং নির্বিশেষে আপনি যা চান ঠিক তা করেন।
জেএমডি

যদি অনুমতিগুলি এটির অনুমতি দেয় না, তবে rm -fবিকল্পটি দিয়ে এটি মুছতে চেষ্টা করবে। এটা ব্যর্থ হবে। এটি আপনাকে বলবে না এটি ব্যর্থ হয়েছে। যদি ফাইলের নামটি পরিবর্তনশীল বা গ্লোব হয় তবে দরকারী।
লরেন্স

কেবল সম্পূর্ণতার জন্য: এমন কিছু রয়েছে rm --interactive=neverযা rm -fব্যতীত এটি ত্রুটির প্রস্থান স্থিতি ফিরে আসে না except আরও তথ্যের জন্য এখানে দেখুন: unix.stackexchange.com/questions/72864/…
লেসমান

উত্তর:


282

-fবিকল্প স্পষ্টভাবে কি আপনি ব্যবহার করে থাকতে চাই।

ফাইল অনুমতি সম্পর্কে এটি নিশ্চিতকরণ হ'ল:

$ touch myfile    
$ chmod 400 myfile
$ rm myfile       
rm: remove write-protected regular empty file `myfile'?

তাই rmআপনাকে সতর্ক আপনি একটি আপনি যে ফাইলটি লিখতে অনুমতি নেই মুছে ফেলতে চেষ্টা করবে। ডিরেক্টরিতে যদি আপনার লেখার অনুমতি থাকে তবে এটি কিছুটা অদ্ভুত হয় তবে এটি rmসাধারণত আপনাকে এ সম্পর্কে সতর্ক করে।


1
সর্বাধিক, তবে সমস্ত সিস্টেম জিজ্ঞাসা করবে না (আমি মনে করি)। কিছু প্রয়োজন -i
ডেভপ্যারিলো

1
আপনি যদি ত্রুটি বার্তাটি চান তবে ত্রুটির প্রস্থান কোডটি না চান তবে জিল বার্কার্সের উত্তর দেখুন । আমি set -eআমার সমস্ত ব্যাশ স্ক্রিপ্টগুলিতে ব্যবহার করি যাতে কোনও কমান্ড ত্রুটি দেওয়ার পরে স্ক্রিপ্টটি প্রস্থান করে। আমি প্রায়শই rmকোনও ত্রুটি দিলে আমাকে স্ক্রিপ্ট বলতে চাই , তবে যাই হোক না কেন চালিয়ে যান। চলতে থাকে।
ক্লেডাক্স

124

আর একটি সমাধান হ'ল: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command

আপনার আদেশের পরে কেবল একটি OR- বিবৃতি যুক্ত করুন:

rm -rf my/dir || true

এইভাবে, যখন # 1 বিবৃতি ব্যর্থ হয় (ত্রুটি ছুড়ে দেয়), স্টেটমেন্ট # 2 চালান, যা সহজ true


4
এটি ত্রুটিটি প্রিন্ট করে এবং মৃত্যুদন্ড কার্যকর করে, যা আমার মামলার জন্য পছন্দসই ছিল।
ওয়ার্ল্ডসায়শি

9
বা কেবল rm -rf my/dir ||:আরও সংক্ষিপ্ত হতে হবে (এর :জন্য সংক্ষিপ্ত true)
গডস্মিথ

আমার মতে আরও ভাল সমাধান। কী ঘটছে এবং ফলাফলের কোডটি কেন উপেক্ষা করা হচ্ছে তা সহজেই দৃশ্যমান। আমি এটা পছন্দ করি!
মাভামার্টেন

76

আমি পার্টিতে দেরি করে চলেছি, তবে আমি এটি সব সময় ব্যবহার করি। কোনও Makefile এ, -সেই লাইনের ফেরতের মান উপেক্ষা করার জন্য একটি লাইনের শুরুতে যুক্ত করুন । তাই ভালো:

-rm lexer.ML interpparse.ML interpparse.mli

9
এটি তবুও কনসোলে ত্রুটি মুদ্রণ করবে, যা আপনাকে মেক আউটপুটে ত্রুটি উপেক্ষা করতে প্রশিক্ষণ দেয়, যা সম্ভবত আপনি চান না। rm -rf আমার মতে একটি ভাল বিকল্প।
গডস্মিথ

@ গডসমিথ আমি পুনরাবৃত্তি মোছা চাপ দেওয়ার চেয়ে বরং একটি ত্রুটি উপেক্ষা করব। এটি খুব দুষ্টু হতে পারে। এবং মেকফিল নির্দিষ্ট সিনট্যাক্সের জন্য +1
দাইশি

আরএম-আরএফ যদি "দুষ্টু" হতে পারে তবে এর অর্থ হ'ল আপনি সংস্করণ নিয়ন্ত্রণের অধীনে কোনও ডিরেক্টরি বাইরে তৈরি করা ব্যবহার করছেন। কেন?
গডস্মিথ

ডকুমেন্টেশনের একটি লিঙ্ক দিন, দয়া করে। এই বৈশিষ্ট্যের বিবরণ খুঁজে পেতে পারে।
জর্জ সোভেটোভ


14

আপনি যদি -f বিকল্পটি ব্যবহার করতে না চান তবে বিকল্পটি হ'ল:

rm filethatdoesntexist 2> /dev/null 

এটি মুদ্রণ করা থেকে ত্রুটিগুলি ঠিক রাখবে।


9
দুর্ভাগ্যক্রমে এটি এখনও একটি ত্রুটি প্রস্থান কোড দেবে।
শান ম্যাকডোনাল্ড

8

আপনি যদি ফাইলের নামগুলি গ্লোব করার কোনও উপায় খুঁজে পান rmতবে এটি কোনও মিল খুঁজে না পেয়ে অভিযোগ করবে না। সুতরাং lexer.m* interpparse.*ইত্যাদির মতো কিছু আপনার পক্ষে কাজ করা উচিত (সতর্কতা অবলম্বন করুন আপনি অবশ্যই খুব বেশি মুছে ফেলছেন না)। এছাড়াও, যাওয়ার -fএক নিখুঁত যুক্তিযুক্ত উপায়, যতক্ষণ না আপনি এই ফাইলের অনুমতিগুলি আশা করেন না যে আপনি চান না এমন ফাইল মুছে ফেলার হাত থেকে বাঁচাবেন - আপনি যদি এটি মুছতে না চান তবে এটি রাখবেন না তালিকার মধ্যে প্রযোজ্য.


আমি মুছে ফেলতে চাই না এমন একটি লেক্সার.মিল ফাইল রয়েছে বলে গ্লোববিং প্রশ্নটির বাইরে থাকবে। কেন -f যুক্তিসঙ্গত তা প্রদর্শনের জন্য ধন্যবাদ। আমি মনে করি যে অনেকগুলি বিপথগামী হওয়ার পরে আমি অত্যধিক যত্নবান হতে চাই sudo rm -rf
জেসন বেকার

আরও বাধাও না lexer.m?...? এটা ধরবে lexer.mlএবং lexer.mz, কিন্তু না lexer.mllবা lexer.mla
জেএমডি

1
@ জেএমডি: আমি মনে করি এটি আপনার শেল এবং গ্লোব্বিংয়ের জন্য কোন প্যাটার্ন-ম্যাচিং সমর্থন দেয় তার উপর নির্ভর করে।
নিক বেস্টিন

6

-F বিকল্পের অর্থ হ'ল যদি প্রত্যাশার মতো কিছু না করা হয় তবে আপনাকে অনুরোধ করা হবে না। এর অর্থ এই নয় যে অনুমতিগুলি আমলে নেওয়া হয় না।

আপনার যদি কোনও ফাইল সরানোর পক্ষে যথেষ্ট সুযোগ না থাকে তবে এটি সরানো হবে না।

কিন্তু , যদি আপনার সুবিধাগুলি পরিবর্তন করার যথেষ্ট সুযোগ থাকে তবে আপনার ফাইলটি সরানো হবে। আপনি যখন মালিকের (-r --------) এর জন্য কেবল পঠন অনুমতি নিয়ে কোনও ফাইলের মালিক তখন এটিই হয়। মালিক হিসাবে, আপনি chmod u+wএটি মুছে ফেলতে পারেন: rm -fসেই ফাইলটি সরিয়ে ফেলবেন।


5

এর সাথে অনুরূপ কোনও লাইনে সহায়তা করতে পারে:

touch fakefile.exe fakefile.o && rm *.o *.exe

আমি জানি যে এটি খুব স্মার্ট নয়, তবে এটি কাজটি করে।


3

একটি বিকল্প:

RmIfIsFile() {  for f in "$@"; do [ -f $f ] && rm $f; done; };  RmIfIsFile lexer.ml interpparse.ml interpparse.mli

খুব খারাপ Makefiles লাইন জুড়ে শেল ফাংশন সংজ্ঞা ভাগ করতে পারে না।


আপনি কি পরের দিকে চালিয়ে যাওয়ার জন্য একটি সারির শেষে \ (ব্যাকস্ল্যাশ) ব্যবহার করার চেষ্টা করেছেন?
কিছু

@ কিছু: হ্যাঁ, এগুলি একাধিক লাইনে ছড়িয়ে দেওয়া যেতে পারে তবে সেগুলি রেসিপিগুলিতে ভাগ করতে আপনাকে সংজ্ঞাটি পরিবর্তনশীল করতে হবে।
পুনরায় পোস্টার

3

আমি শেল স্ক্রিপ্টগুলিতে যা ব্যবহার করি তা এখানে। এটি ত্রুটি বার্তা এবং ত্রুটি কোড লুকায়।

rm doesnotexist 2> /dev/null || echo > /dev/null

কিভাবেrm doesnotexist 2&> /dev/null
ব্যবহারকারী 8162 23

1

ফাইলগুলি rm করার আগে আপনি সেগুলিকে স্পর্শ করতে পারেন। এটি তাদের তৈরি করে যদি তাদের অস্তিত্ব না থাকে :-)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli

1

rm -rf ppp>/dev/null 2>&1 আপনাকে নতুন লিখুন ত্রুটি বার্তাটি সমস্যাটি দেখা দেয়, যদি ত্রুটিটি STDERR 2 তে না উত্পন্ন হয় তবে STDOUT 1 ... এটি ঘটে যখন কমান্ড ত্রুটি নয় বরং সতর্কতা জেনারেট করে। আপনাকে ফিল্টার সেট করতে হবে এবং এই বার্তাটি সরিয়ে ফেলতে হবে। তবে এই মামলাটি সাধারণ।


1

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

if [ -f lexer.ml ]; then
  rm lexer.ml
fi

আপনি যদি নিশ্চিত হন যে আরও ফাইল থাকতে চান তবে আরও পরীক্ষার ধারা যুক্ত করুন।

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