ইউনিক্সে বর্তমান ডিরেক্টরি rm -r * সাফ করা হচ্ছে


4

এটি বর্তমান ডিরেক্টরিটি পরিষ্কার করার সঠিক উপায়?

rm -r * .
linux  shell 

উত্তর:


5

আমি সাধারণত শ্রেণিবিন্যাসের মধ্যে কেবল একটি স্তর সরিয়ে নিয়ে যাই, তারপর নামটি দিয়ে ডিরেক্টরিটি সরান এবং এটি পুনরায় তৈরি করুন:

cd ..
rm -rf dirname
mkdir dirname
cd dirname

কারণ rm -rf *এটি ভুল ডিরেক্টরিতে ব্যবহারের ত্রুটি কেসকে সরিয়ে দেয় ।

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

যদি আমার কোনও স্ক্রিপ্টে এটি করার দরকার হয়, আমি সম্ভবত একটি ফাংশন তৈরি করব যা বর্তমান ডিরেক্টরিটি সংরক্ষণ করে, একটি স্তরকে সরিয়ে দেয়, মুছে ফেলবে এবং নতুন খালি দির তৈরি করবে এবং সেখানে সরে যাবে।


+1 এটি কমান্ড-লাইন আর্গুমেন্টগুলি উপচে পড়ার সম্ভাবনাও দূর করে। আইআইআরসি, আপনার কেবলমাত্র সেন্টিমিড আরোগুলির জন্য 1 কে বাইট rm *থাকতে পারে , তাই এর চেয়ে আরও প্রসারিত হতে পারে। দির আইএমএইচও পুনরুদ্ধার করা সেরা বিকল্প (যদি আপনার কাছে হার্ডলিঙ্ক না থাকে তবে এটি কেবল নোংরা)।
বেটগ্যামিট 18

আমি নিশ্চিত নই যে এই পন্থাটি গ্যারান্টি দেয় যে ডেরনামটি একই অনুমতি / মালিকানা দিয়ে তৈরি করা হয়েছিল আপনি মুছে ফেলার আগে এটি ছিল, মুছে ফেলার আগে এটি পরীক্ষা করা ভাল ধারণা হতে পারে।
বেনামে

@ নামবিহীন লুকার, আমি অনুমতিগুলির বিষয়টি উল্লেখ করেছি। এটি আমার জন্য 90% সমাধান - আমার খুব কমই বিজোড় অনুমতি সহ ডিরেক্টরি রয়েছে (কমপক্ষে অদ্ভুত-নামযুক্ত ফাইলগুলির সাথে ডিরেক্টরি সংখ্যার তুলনায়))
মার্ক বেসি

1
@ মারকবেসি আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি নিজের উত্তরে আরও দৃশ্যমান সতর্কতার শব্দটি (ডিরেক্টরিতে অনুমতি সম্পর্কিত ক্ষেত্রে) রাখবেন।
গুনবার্ট

6

না, এবং বিভিন্ন কারণে: 1) এই কমান্ডটি মুছে ফেলার চেষ্টা করবে ., যা বর্তমান ডিরেক্টরি, এবং এভাবে ব্যর্থ হবে; 2) এই কমান্ডটি "লুকানো" ফাইলগুলি মুছে ফেলবে না যা একটি 'দিয়ে শুরু হয়। চরিত্র; 3) কমান্ড ডিরেক্টরি মুছে ফেলবে না।

আপনি ব্যবহার করতে পারে rm -rf *। এটি সমস্ত ফাইল এবং ডিরেক্টরিগুলি সরিয়ে ফেলবে, তবে এটি ডটফাইলগুলি সরিয়ে ফেলবে না। আপনি find . -type f | xargs rmলুকানো ফাইলগুলি সহ সমস্ত ফাইল সরাতে ব্যবহার করতে পারেন তবে এটি ডিরেক্টরিগুলি সরাবে না।

সুতরাং, আপনি এটি ব্যবহার করতে পারেন:

$ find . -print0 -type f -o -type d -not -name '\.' | xargs -0 rm -rf

এখানে আপনি পুনরাবৃত্তভাবে সমস্ত ফাইল এবং ডিরেক্টরিগুলি খুঁজে পান (যতক্ষণ না তাদের '।' বলা হয় না) এবং তারপরে সেগুলি মুছে ফেলুন। -print0এবং -0আর্গুমেন্ট এটি সঠিকভাবে সেগুলির নামের মধ্যে উপস্থিত হোয়াইটস্পেস সঙ্গে ফাইলের নামের হ্যান্ডেল করার অনুমতি দেয়।


2
এই কোডটি সমস্ত আইটেম মুছে ফেলবে না। কেবল একটি আইটেমের নামে একটি স্থান মনে করুন। তাই এবং সাথে -print0আরও ভাল ব্যবহার । find-0xargs
শি

ইউনিক্স কি লিনাক্স থেকে অনেক আলাদা? আমি rm --recursive * .*[^.]*লিনাক্সে ব্যবহার করতে পারি , এবং ভাবছিলাম যে এটি ইউনিক্সে কাজ করবে কিনা।
ধানের ল্যান্ডাউ

1
@ প্যাডিলান্দাউ এটি এই উত্তরের কোনও মন্তব্য নয়, সত্যই; এটি একটি পৃথক প্রশ্ন। এবং "ইউনিক্স" একটি অত্যন্ত বিস্তৃত শব্দ, এইচপি-ইউএক্স এবং এআইএক্স থেকে ম্যাক ওএস এক্স পর্যন্ত সমস্ত কিছুকে অন্তর্ভুক্ত করে। এটি বলেছে, এটি আমার কাছে দেখে মনে হচ্ছে যে এই rmকমান্ডটি সমস্ত নন-ডট-ফাইল এবং সমস্ত ডট-ফাইল সরিয়ে ফেলবে যা এতে রয়েছে কমপক্ষে একটি নন-ডট চরিত্র। চেষ্টা করুন touch ...(হ্যাঁ, তিন পিরিয়ড), তারপরে এটি চালাচ্ছেন।
একটি সিএনএন

@ মাইকেল কেরল্লিং - ধন্যবাদ, তবে আমি এটি বিকল্প হিসাবে দিচ্ছিলাম। এটি ইউনিক্সে (আমি লিনাক্স ব্যবহার করি) কাজ করবে কিনা তা নিশ্চিত ছিলাম না, এজন্য আমি পৃথক উত্তরের পরিবর্তে একটি মন্তব্য পোস্ট করেছি। যদি এটি লিনাক্সে কাজ করে তবে আমি এটিকে একটি সহজ উত্তর বিবেচনা করব। বিটিডাব্লু, touch ...প্রকৃতপক্ষে ...লিনাক্স নামক একটি লুকানো ফাইল তৈরি করে ।
ধানের ল্যান্ডাউ

@ প্যাডিল্যান্ডউ ... যা আপনার rmআদেশটি মুছে দেয় না (আমি কেবল এটি চেষ্টা করেছি)।
একটি সিএনএন

2

আপনি যদি এটি করতে পারেন তবে -মাইন্ডপথ এবং -ডিলেট স্যুইচগুলি যদি পাওয়া যায়:

find . -mindepth 1 -delete

তোমার সাথে থাকবো করতে চান, POSIX , আপনি এই (যেমন দেখা করতে পারি না unix.com ):

find . \( ! -name . -prune \) -exec rm -rf {} \+

1

একটি সহজ সমাধান যদি আপনি সন্ধানটি ব্যবহার করতে না চান তা হ'ল বর্তমান ডিরেক্টরিটি সরিয়ে ফেলা হয় তবে এটি আবার তৈরি করুন:

rm -rf "`pwd`" && mkdir "`pwd`" && cd "`pwd`"

আপনি সম্ভবত ক্যাশে চাই চাই pwd। আপনি মুছে ফেলার পরে এটি সঠিকভাবে কাজ করবে কিনা তা আমি নিশ্চিত নই। _dir=$(pwd) ; rm -rf "$_dir" && ...। যদিও এটি পরীক্ষা করা হয়নি, তাই আমি ভুল হতে পারি।
বেটগ্যামিট

1

আপনি যদি ব্যাশ ব্যবহার করছেন (সংস্করণ 4 বা তারপরের), আপনি dotglobআপনার গ্লোবটিতে ডট দিয়ে শুরু হওয়া ফাইলের নামগুলি অন্তর্ভুক্ত করতে শেল বিকল্পটি ব্যবহার করতে পারেন ।

shopt -s dotglob
rm -r -- *

উপরেরগুলি কয়েক হাজার হাজার ফাইল সহ ডিরেক্টরিগুলি ভাঙ্গবে; সেক্ষেত্রে আপনি ব্যবহার করতে পারেন printf(যা ব্যাশ বিল্টিন হয়ে এআরজি_ম্যাক্সের মুখে হাসে ) এবং xargs(যা নিরাপদ সংখ্যক যুক্তি সরবরাহ করবে rm)।

shopt -s dotglob
printf '%q ' * | xargs rm -r --

dotglobআপনার সাথে কাজ শেষ হয়ে গেলে আপনি আনসেট করতে পারেন :

shopt -u dotglob

শেল বিকল্পের সাথে গোলমাল না করে এটি করার আর একটি উপায় হ'ল:

rm -r -- * .[^.]* ..?*
##  or
printf '%q ' * .[^.]* ..?* | xargs rm -r --

প্রথম গ্লোব *বর্তমান ডিরেক্টরিতে সমস্ত কিছু মেলে যা কোনও বিন্দু দিয়ে শুরু হয় না; দ্বিতীয়টি .[^.]*বিন্দু দিয়ে শুরু হওয়া সবকিছুর সাথে মিলে যায়, তার পরে একক নন-ডট অক্ষর এবং তারপরে অন্য কোনও অক্ষর অনুসরণ করা হয়; তৃতীয় গ্লোব দুটি বিন্দুর সাথে মেলে, তারপরে যে কোনও একটি অক্ষর এবং তারপরে আরও কয়েকটি অক্ষর। আপনি যদি ডটগ্লোব বিকল্প ছাড়াই শেলটিতে আটকে থাকেন তবে এটি কার্যকর হতে পারে; তবে, এ জাতীয় ক্ষেত্রে printfশেল বিল্টিন নাও থাকতে পারে, বা %qপতাকাটির অভাব হতে পারে (যা প্রদত্ত যুক্তিগুলিতে সমস্ত স্থান এবং অস্বাভাবিক চরিত্রের উদ্ধৃতি দেয়, যাতে এটি নিরাপদ করে তোলে xargs), সুতরাং আপনার সম্ভবত একটি ব্যবহার করা উচিত findএই জাতীয় ক্ষেত্রে ভিত্তিক সমাধান।


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

@ টিজেমসন হ্যাঁ, যদিও এটি বেশ বিশাল সংখ্যক ফাইল হতে হবে ...
জুলস

আমি কাজ করে এই গত সপ্তাহে ছুটেছি। এটি 500,000 ফাইলের কাছাকাছি কিছু ছিল ...
1313

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