ফাইলগুলি ইতিমধ্যে খালি থাকলে ত্রুটি না করে ডিরেক্টরিতে মুছুন


31

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

rm /tmp/our_cache/*

তবে, যদি /tmp/our_cacheএটি খালি থাকে (আমাদের পরীক্ষার সার্ভারে দ্রুত ধারাবাহিকতায় অনেকগুলি পরিবর্তন আনতে মোটামুটি সাধারণ), এটি নিম্নলিখিত ত্রুটি বার্তাটি মুদ্রণ করে:

rm: cannot remove `/tmp/our_cache/*': No such file or directory

এটি কোনও বড় ব্যাপার নয়, তবে এটি খানিকটা কুৎসিত এবং আমি এই স্ক্রিপ্ট থেকে আউটপুটে শব্দ-টু-সিগন্যাল অনুপাতটি হ্রাস করতে চাই।

ডিরেক্টরিটি ইতিমধ্যে খালি রয়েছে এমন অভিযোগ বার্তা না পেয়ে কোনও ডিরেক্টরি বিষয়বস্তু মুছতে ইউনিক্সে একটি সংক্ষিপ্ত উপায় কী?

উত্তর:


48

যেহেতু আপনি সম্ভবত কোনও প্রম্পট না করেই সমস্ত ফাইল সরিয়ে ফেলতে চান, কেন কেবল অস্তিত্বহীন ফাইলগুলি উপেক্ষা -fকরার rmজন্য স্যুইচটি ব্যবহার করবেন না ?

rm -f /tmp/our_cache/*

ম্যান পৃষ্ঠা থেকে:

-f, --force
          ignore nonexistent files, never prompt

এছাড়াও, যদি কোনও উপ-ডিরেক্টরি থাকতে পারে /tmp/our_cache/এবং আপনি সেগুলি এবং তাদের বিষয়বস্তুগুলিও মুছে ফেলতে চান তবে -rস্যুইচটি ভুলে যাবেন না ।


3
সবচেয়ে সুস্পষ্ট সমাধান এবং আমি এটি সম্পর্কে চিন্তা করি না! আমি এই কমিকের প্রথম লোকটির মতো অনুভব করছি xkcd.com/399 ;-)
হিউজেনস

6
find /tmp/our_cache/ -mindepth 1 -delete

সম্পাদনা 1

অপসারণ "-প্রকার চ

সম্পাদনা 2

-mindepth 1অনুসন্ধানের রুট ডিরেক্টরিটি সরিয়ে ফেলা ( -type fসীমাবদ্ধতা সরিয়ে নেওয়ার পরে ) রোধ করতে অ-মানক বিকল্প যুক্ত করা হয়েছে ।


কেবল একটি নোট, আমি -type fঅজানা থাকি যেহেতু অস্থায়ী ডিরেক্টরিগুলিও থাকতে পারে (যদিও প্রশ্নের উদাহরণে তাদের জন্য অ্যাকাউন্ট নেই, সুতরাং তারা সম্ভবত সেখানে নেই ...)
ইজকাটা

1
ব্যবহার -type fকরা কেবল নিয়মিত ফাইলগুলি মুছবে, সুতরাং উদাহরণস্বরূপ প্রতীকী লিঙ্কগুলি মোছা হবে না।
হিউজেনস

@ রশ দুঃখিত, আমি এটি যাচাই করিনি তবে কেবল ম্যান পৃষ্ঠাগুলিতে একবার দেখেছিলাম যা "ফাইলগুলি মুছুন" বলে, ডিরেক্টরিগুলির কোনও উল্লেখ না করে। আমি আমার মন্তব্য মুছে ফেলছি।
হউকে লেগেছে

1
এটি অপসারণ করে /tmp/our_cacheযাতে আপনিও করতে পারেন rm -r /tmp/our_cache। আপনি অ-মানক বিকল্পগুলি ব্যবহার করার সময়, আপনি ব্যবহার করতে পারেন -mindepth 1। মনে রাখবেন যে এর বিপরীতে rm /tmp/our_cache/*, এটি উপ-ডিরেক্টরি এবং তাদের সামগ্রী এবং লুকানো ফাইলগুলিও সরিয়ে দেয়।
স্টাফেন চেজেলাস 15:30

2

আপনি স্ট্যান্ডার্ড ত্রুটিটিকে পুনর্নির্দেশ করতে পারেন /dev/nullযাতে এটি এটি প্রিন্ট করে না

$  rm /tmp/our_cache/* 2>/dev/null

2
এটি বললে কি ত্রুটিগুলি দমন করা উচিত নয়, যদি বলুন যে কোনও ফাইল ব্যবহৃত হচ্ছে কারণ এটি মুছে ফেলা যায় না? টার্গেট ডিরেক্টরিটি ফাঁকা থাকলে কেবলমাত্র ত্রুটিটিই আমি দমন করতে চাই shown এটির মনে হচ্ছে এটির অযাচিত পার্শ্ব প্রতিক্রিয়া রয়েছে।
মার্ক আমেরিকা

এমনকি যদি আপনি এমন কিছু ফাইল মুছে ফেলার চেষ্টা করেন যা কিছু প্রক্রিয়া খোলা থাকে তবে আপনি ত্রুটি পাবেন না।
প্রদীপচেত্রী

1

আর একটি উপায় (যদিও সামান্য ওভারকিল ...):

[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*

এটি ব্যবহার করে testবা [এটি পরীক্ষা করতে যদি lsআপনার ডিরেক্টরিতে স্ট্রিংটি চালানো থেকে খালি না থাকে। তারপরে এবং যদি কেবলমাত্র সেই স্ট্রিংটি খালি না থাকে এটি আপনার ডিরেক্টরিতে থাকা সমস্ত কিছু সরিয়ে দেয়।

দ্রষ্টব্য: গ্লোবকে উইলের বাইরে রেখে lsকোনও ফাইলের ত্রুটি দমন করবে।


-1

আপনার স্ক্রিপ্টটি বেসে থাকলে আপনি চেষ্টা করতে পারেন:

if test "$(ls /tmp/our_cache/)" !=  ""; then rm /tmp/our_cache/*; fi

এটি করার পরেও যদি "আসল" সমস্যা দেখা দেয় বা কোনও ফাইল সুরক্ষিত থাকে (তখন আপনাকে এই ধরণের ফাইলগুলি মুছতে -fমডিফায়ারের প্রয়োজন rmহবে) তবে কোনও ফাইল না থাকলে ত্রুটিটি এড়ানো হবে।

আপনি যদি আপনার স্ক্রিপ্টিংয়ের জন্য BASH এর চেয়ে অন্য শেল ব্যবহার করেন যেমন zsh, ksh, আপনি এই অন্যান্য বাক্য গঠন চেষ্টা করতে পারেন যা আরও বহনযোগ্য হতে পারে:

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.