সমস্ত ফাইল এবং সমস্ত লুকানো ফাইল ছাড়া rm -rf। & .. ত্রুটি


82

rm -rf /some/path/* সেই দির (এবং সাবডিয়ার্স) -এর সমস্ত অ-গোপনীয় ফাইল মুছবে।

rm -rf /some/path/.* সেই দিরের সমস্ত লুকানো ফাইল মুছে ফেলা হয় (তবে সাবডিয়ার নয়) এবং নিম্নলিখিত ত্রুটি / সতর্কতাও দেয়:

rm: cannot remove directory: `/some/dir/.'
rm: cannot remove directory: `/some/dir/..'

সতর্কতা / ত্রুটি .এবং এর সম্পর্কে সতর্কতা না পেয়ে কোনও লক্ষ্য ডিরেক্টরিতে সমস্ত লুকানো এবং গোপনীয় ফাইল এবং ফোল্ডারগুলি পুনরাবৃত্তভাবে অপসারণ করার সঠিক উপায় কী ..?

উত্তর:


39

আপনি সর্বদা ত্রুটি বার্তা প্রেরণ করতে পারে /dev/null

rm -rf /some/path/.* 2> /dev/null

আপনি ঠিক করতে পারে

rm -rf /some/path/
mkdir /some/path/

... তারপরে আপনাকে প্রথমে লুকানো ফাইলগুলি নিয়ে বিরক্ত করতে হবে না।


2
তবে আমি যদি কেবল লুকানো ফাইলগুলি মুছতে চাই?
সিএমসিডিগ্রাগনকাই

@ সিএমসিডিগ্রাগনকাই যা আলাদা প্রশ্ন হওয়া উচিত, তবে আপনি গিলসের জবাব ( rm ..?* .[!.]*এটি করা উচিত) এর সমাধান খুঁজে পেতে পারেন ।
অশুভসূচ

15
ডিরেক্টরি মুছে ফেলা এবং পুনরুদ্ধার করা ফাইলের অনুমতিগুলি ঠিক পরে না হওয়ার ঝুঁকির সৃষ্টি করে (বিশেষত সার্ভার পরিবেশে গুরুত্বপূর্ণ)। কে স্বয়ংক্রিয়ভাবে আগের মত একই অনুমতি দিয়ে ফোল্ডার তৈরি করতে পারে?
ইয়ো লুডকে

1
@ ইয়োলড্কে আপনি একেবারে সঠিক, অনেক পরিস্থিতিতে ফোল্ডারটি মুছে ফেলা এবং পুনরুদ্ধার করা অর্থহীনভাবে সেই ফোল্ডারটি খালি করার সমতুল্য নয়; তাই সাবধান!
থমাস

ডিরেক্টরি মুছে ফেলা সর্বদা সম্ভব হয় না। আমার ক্ষেত্রে ডিরেক্টরিটি একটি ডকার ভলিউম, এবং আমি যখন ভলিউমের ভিতরে যা খুশি করতে পারি, আমি ধারকটির মধ্যে থেকে ভলিউমটি নিজেই পরিবর্তন করতে পারি না।
dovidweisz

85

*সমস্ত নন-ডট-ফাইলের সাথে .[!.]*মেলে , বাদে সমস্ত ডট ফাইলের .সাথে মেলে ..এবং যার নাম দিয়ে শুরু হওয়া ফাইলগুলি , এবং ..?*বাদে সমস্ত ডট-ডট ফাইলের সাথে মেলে ..। একসাথে তারা ব্যতীত অন্য সব ফাইল মেলে .এবং ..। এই তিনটি নিদর্শনগুলির কোনওটির সাথে যদি কিছু মেলে না, তবে এটি নিজের কাছে প্রসারিত হয়; rm -fঅস্তিত্বহীন যুক্তিগুলির বিষয়ে চিন্তা করে না, সুতরাং এটি কোনও বিষয় নয়।

rm -rf ..?* .[!.]* *

আপনি ব্যবহার করতে পারেন find। এটি আরও জটিল তবে উপরের ওয়াইল্ডকার্ডগুলি আপনার সিস্টেমের কমান্ড লাইন দৈর্ঘ্যের সীমা ছাড়িয়েও প্রসারিত হবে এমন অনেকগুলি ফাইল থাকলেও কাজ করার সুবিধা রয়েছে।

find . -name . -o -prune -exec rm -rf -- {} +

ডিরেক্টরিটি সরিয়ে ফেলা এবং পুনরায় তৈরি করা আপনার কাছে আরও পরিষ্কার হতে পারে। অন্য কোনও প্রোগ্রাম একই সাথে মূল ডিরেক্টরিতে ফাইল তৈরি করা হলেও খালি ডিরেক্টরি তৈরির ফলে এর সুবিধা (বা ডাউনসাইড) হতে পারে।


8
এটি মেনে নেওয়া উত্তর হওয়া উচিত, কারণ এটি পিতামাতার ট্র্যাভারসাল এবং সম্ভাব্য মোছা প্রতিরোধ করে।
rbellamy

findবিকল্প "সফল" এমনকি যদি কিছু ফাইল সফলভাবে মোছা হয় ফেরৎ; স্ক্রিপ্ট জন্য ভাল না।
ফ্রাঙ্কলিন ইউ

আপনার দ্বিতীয় findকমান্ডের সাথে সম্পর্কিত, সন্ধানের ম্যানপেজটি "কারণ -ডিলিটটি বোঝায় - প্রচ্ছন্ন, আপনি কার্যকরভাবে-সংজ্ঞা এবং -প্রেমী একসাথে ব্যবহার করতে পারবেন না।" - তবুও আপনি ব্যবহার করেন -prune -delete?
ডক্টর জে

@ ডক্টরজে প্রকৃতপক্ষে, -pruneএখানে কিছু করেন না। এবং ফিরে পড়ার সময় আমি দেখতে পাচ্ছি যে আমি প্রশ্নের সঠিক উত্তর দিলাম না: আমি পুনরাবৃত্তি না করায় যত্ন নিয়েছিলাম, তবে প্রশ্নটি স্পষ্টভাবে পুনরাবৃত্ত মোছার জন্য বলেছে। আমি আমার উত্তর সংশোধন করেছি।
গিলস 21

2
@ হাইলেম জেডএস-এ, ইতিহাস প্রতিস্থাপন সক্ষম হওয়ার .[^.]*পরিবর্তে আপনাকে লিখতে হবে .[!.]*(যা পূর্বনির্ধারিত ক্ষেত্রে ইন্টারেক্টিভভাবে হয় তবে স্ক্রিপ্টগুলিতে নয়), কারণ zsh !ইতিহাসের উল্লেখ হিসাবে পার্স করে । তবে zsh এ আপনার প্রথম স্থানের দরকার পড়বে না, আপনি কেবল *(D)ডট ফাইলগুলি ( .বা ..না ছাড়াই ) ওয়াইল্ডকার্ড ম্যাচে অন্তর্ভুক্ত করতে ব্যবহার করতে পারেন ।
গিলস

21

বেশিরভাগ লিনাক্স ডিস্ট্রোজে এটি সর্বাধিক সুবিধাজনক উপায়টি উপলব্ধি করেছেন:

ls -A1 | xargs rm -rf

কোথায়

-A= সবকিছু তালিকা ব্যতীত . এবং..

-1 = প্রতিটি আইটেমকে এক লাইনে রাখুন


4
খারাপ দিক যা আমি দেখছি তা হল: এটি করতে আপনাকে ডিরেক্টরিতে সিডি করতে হবে need
কুমার

ls -A1 /your/path/ | xargs rm -rfআবেদন করা উচিত
Godzillante

নাপ..এটি সাহায্য করে না - উদাহরণস্বরূপ: ls -A1 test / test / | xargs rm -rf এই কমান্ডটি ফাইলগুলিকে মুছে দেয় যা আমি বর্তমানে 'সিডিতে' আছি .. ডিরেক্টরি ~ / পরীক্ষায় নেই।
কুমার

5
কোনও ফাইলের নামের ফাঁকা, নতুনলাইন, উদ্ধৃতি বা ব্যাকস্ল্যাশ থাকলে এটি কাজ করে না।
স্টাফেন চেজেলাস

1
-1 উপরের মন্তব্যের কারণে। ↑↑↑↑↑↑↑↑
কিছু

15

হয় dotglobআপনার শেলের বিকল্পটি পরিবর্তন করুন এবং ব্যবহার করুন *বা এর মতো কিছু ব্যবহার করুন find

find somedir -mindepth 1 -delete

2
অথবা আপনি সহজভাবে rm -rf /some/dirএবং তারপরে একটি নতুন খালি ডিরেক্টরি তৈরি করতে পারেন ।
ট্রিপলি

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

4

এটি ঠিক @ গিলস উত্তরগুলির মতো কাজ করা উচিত তবে আরও কমপ্যাক্ট:

rm -rf {,.[!.],..?}*

অথবা

rm -rf dir/to/files/{,.[!.],..?}*

ifকেবল নিরাপদ থাকতে স্ক্রিপ্টগুলিতে ব্যবহারের জন্য একটি যুক্ত করা উচিত :

if [ -d "$DIR" ]; then
    rm -rf ${DIR}/{,.[!.],..?}*
fi

1
অদ্ভুতভাবে যথেষ্ট, উবুন্টু 16.04 এলটিএসে বাশ ওরফে হিসাবে, পূর্ববর্তী উত্তরটি কাজ করছিল না। যাইহোক, alias cleandir='rm -rf {,.[!.],..?}*'না।
স্টিভেন ভেন্টিমাগ্লিয়া

3

আপনার বন্ধু।

find ! -name '.' ! -name '..' -delete

% find ! -name '.' ! -name '..'
./test
./test4
./test4/.test6
./test3
./.test5
./test2
% find ! -name '.' ! -name '..' -delete    
% find ! -name '.' ! -name '..'     
%             

আপনি যদি আপনার বর্তমান ডিরেক্টরি ($ PWD) এর জন্য অন্য কিছু অনুসন্ধান করতে চান তবে findকমান্ডের ঠিক পরে একটি পাথ যুক্ত করুন ; যেমন find /path ! -name '.' ! -name '..' -delete,। আপনি যদি কেবল nডিরেক্টরিগুলির সংখ্যা অবতরণ করতে চান -maxdepth nতবে /pathপ্যারামিটারের ঠিক পরে বিকল্পটি ব্যবহার করুন ।

উপরের কমান্ডটি একটি উবুন্টু 13.04 সিস্টেমে পরীক্ষা করা হয়েছিল। সম্ভবত অন্যান্য, আধুনিক লিনাক্স সিস্টেমে কাজ করবে।


আপনি যে ডিরেক্টরিটি করতে পেরেছিলেন তার সমস্ত ডিরেক্টরি মুছে ফেলার জন্যfind . ! -name '.' ! -name '..' -type d -delete
অ্যান্ডি

2

সতর্কতা / ত্রুটি না পেয়ে লক্ষ্যবস্তু ডিরেক্টরিতে সমস্ত লুকানো এবং গোপনীয় ফাইল এবং ফোল্ডারগুলি পুনরাবৃত্তভাবে অপসারণ করার উপযুক্ত উপায় কী। এবং ..?

প্রশ্নে ডিরেক্টরিটি ধরে নেওয়া হয় ./dir, তখন

rm -rf ./dir

./dirলুকানো ফাইল এবং ডিরেক্টরি সহ, সমস্ত ফাইল মুছে ফেলা হবে পুনরাবৃত্তভাবে এবং ./dirডিরেক্টরি নিজেই।

আপনি যদি ডিরেক্টরিটি নিজেই মুছতে না চান তবে আপনি কেবল এটি পরে তৈরি করতে পারেন, বা ব্যবহার করতে পারেন

find ./dir -mindepth 1 -delete

বা যদি আপনি findসমর্থন না করেন -delete,

find ./dir -mindepth 1 -depth -exec rm -rf {} ';'

ব্যবহারের -mindepth 1ফলে আপনি শীর্ষ স্তরের ডিরেক্টরি রাখতে পারবেন ./dir


এটি সেরা উত্তর হিসাবে চিহ্নিত করা উচিত
ক্রিশিং ক্রিস

1

আমি আপনাকে দিয়ে পরীক্ষা করার পরামর্শ দিচ্ছি

টার্ন- অন ডট (লুকানো ফাইল)

  • সেট dotglob

    shopt -s dotglob

টার্ন - ডট বন্ধ

  • সেট না dotglob

    shopt -u dotglob

এই পদ্ধতিটি ঠিক ঠিক সেইরকমভাবে কাজ করেছিল যেহেতু আমি একটি অনুলিপি কমান্ড চেয়েছি যা লুকানো ডিরেক্টরিগুলি অনুপস্থিত ছিল।

    shopt -s    dotglob
    cp    -rvn  ./$from/*  ./$too/
    shopt -u    dotglob

সুতরাং আমি একটি মুছে ফেলুন (মুছুন) এবং ওফ ...

    shopt -s    dotglob
    rm -fr ../message_splitter--044a/*
    shopt -u    dotglob

... যে কাজ করে!

আমার কাছে এটি ঘটে যে আপনি প্রিয় পাঠক message_splitterডিরেক্টরিটি দেখতে পাচ্ছেন না । যে কোনও উপায়ে এটিতে একটি .svnফোল্ডার রয়েছে যা মুছে ফেলা দরকার এবং এতে অনুলিপি করা উচিত।

manপৃষ্ঠা থেকে ...

dotglob যদি সেট করা থাকে তবে ব্যাশে একটি with দিয়ে শুরু হওয়া ফাইলের নাম অন্তর্ভুক্ত রয়েছে `' পথের নাম প্রসারণের ফলাফলগুলিতে।

রেফারেন্স:


-2

এই কোড ব্যবহার করে দেখুন:

Dirlist=``find /some/path/ -type d -name '.[^.]*'`
for HiddenDir in $Dirlist
do
    rm -rf $HiddenDir
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.