মুছে ফেলা ছাড়া যখন অনুসন্ধানগুলি মুছে ফেলতে সক্ষম হয় নি তখন কেন আমার / সেভ / ডিরেক্টরিতে ফাইলগুলি মুছে ফেলা যায়?


20

আমি ঐ ব্যতীত, বর্তমান ডিরেক্টরি-ট্রির সব ফাইল মুছে ফেলতে চান save। আমি এই আদেশ চালিয়েছি:

 find . \( -name save -prune \) -o -type f -ls | grep /save/

এবং এটি কিছুই পাওয়া যায় নি। তবে আমি যখন এই আদেশটি চালিয়েছি:

 find . \( -name save -prune \) -o -type f -delete

/ সেভ / এ থাকা সমস্ত ফাইল চলে গেছে। আমি কী মিস করছি?


4
ওচ ... আমি আজ কিছু শিখেছি (তোমাকে ধন্যবাদ) এবং আমি এই mv save/ ../some/safer/locationজাতীয় "জেনেরিক" মুছুন কমান্ডের আগে একটি সাধারণ প্রস্তাব দিচ্ছি (... তবে অবশ্যই আপনার পোস্টের আগে আমি একই চেকটি করতাম এবং একই সমস্যায় পড়তাম!)। এখন ফাইল সিস্টেমে ফাইলগুলি for
অলিভিয়ার ডুলাক

3
আমার ব্যথা আপনার প্রতিরোধ।
ওথিয়াস

1
আপনাকে 1000 ধন্যবাদ। কোড (প্রায়শই?) রহস্যজনক উপায়ে কাজ করে ...
অলিভিয়ার ডুলাক


@ লেসমানা আমি আপনার উত্তরটি সেখানে উজ্জীবিত করেছি। দুঃখের বিষয়, আমার
সন্ধানের

উত্তর:


26

-deleteবোঝায় -depthযে কাজ করে না -prune( -depthপাতাগুলি দিয়ে শুরু হয়)। জিএনইউ সংস্করণটির ম্যানুয়ালটিতে এ সম্পর্কে একটি সতর্কতা রয়েছে ( -deleteএটি এখন ফ্রিবিএসডি এক্সটেনশান যা জিএনইউ findএবং আরও কয়েকটি বাস্তবায়ন দ্বারা সমর্থিত )।

info find --index-search=-delete

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

info find --index-search=-prune

কারণ '-ডিলেট' '-ডেপথ' বোঝায়, '-ডিলেট' এর সাথে '-পুন' ব্যবহার করে আপনার ইচ্ছার চেয়ে বেশি ফাইল মুছতে পারে।

এখানে, আপনি rmপরিবর্তে ব্যবহারের বিকল্প পেয়েছেন :

find . -name save -prune -o -type f -exec rm -f {} +

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

একটি নিরাপদ বিকল্প:

find . -name save -prune -o -type f -execdir rm -f -- {} \;

উপরে উল্লিখিত সমস্যা নেই তবে rmপ্রতি ফাইলের মধ্যে একটি চালানো মানে running --FreeBSD 'র বাস্তবায়ন না উপসর্গ ফাইলের নাম গনুহ এক যে সঙ্গে জন্য প্রয়োজনীয় ./

বিকল্পভাবে, কস্টাসের পরামর্শ অনুসারে:

LC_ALL=C find . ! -name save ! -path '*/save/*' -type f -delete

(তবে এটি এখনও অযথা saveডিরেক্টরিতে নেমেছে )

LC_ALL=Cসেখানে তাই *বাইট কোন ক্রম (এমনকি যেগুলি বর্তমান লোকেলে বৈধ অক্ষর গঠন করবেন না) সাথে মেলে। দ্রষ্টব্য যে এটি ত্রুটি বার্তাগুলির ভাষা (ব্যবহারকারীর ভাষার পরিবর্তে ইংরেজি) প্রভাবিত করবে।


এখানে সুরক্ষা সমস্যাটি কী rm?
jrw32982

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