কোনও ডিরেক্টরি থেকে সমস্ত ফাইল মুছতে পারি যখন এটি "আর্গুমেন্টের তালিকা খুব দীর্ঘ" বলে প্রতিবেদন করে


11

এটিতে কয়েক লক্ষ ফাইল সহ আমার একটি ডিরেক্টরি রয়েছে।

আমি সমস্ত ফাইল মুছতে চাই, তবে আরএম * -ফ রিপোর্ট: "যুক্তি তালিকা খুব দীর্ঘ"

এই ডিরেক্টরিটি পরিষ্কার করার সর্বোত্তম উপায় কী?


সম্পর্কিত, আধা-সদৃশ: unix.stackexchange.com
ডেনিলসন সা মায়া

উত্তর:


11

ইভেন্টটি আপনি ডিরেক্টরিটি সরাতে পারবেন না, আপনি সর্বদা অনুসন্ধান ব্যবহার করতে পারেন।

find . -maxdepth 1 -type f -exec rm -f {} \;

এটি বর্তমান ডিরেক্টরিতে সমস্ত ফাইল মুছে ফেলবে এবং কেবল বর্তমান ডিরেক্টরি (সাব ডিরেক্টরি) নয়।


প্রায় নিখুঁত (আমার
পোস্টটিও দেখুন

2
লিনাক্সে আপনি ""; "এর পরিবর্তে" + "ব্যবহার করে এটি আরও দ্রুত করতে পারেন। এটি একসাথে "আরএম" প্রতি আরও ফাইল সরিয়ে ফেলবে।
থমাস

5
আরও দ্রুত: find dir/to/delete -delete( rmমুছতে ফাইলের জন্য কোনও প্রক্রিয়া উত্সাহ দেয় না )।
মর্টেন সিবুহর

মর্টেন: তিনি কখনই ডিরেক্টরিটি নিজেই মুছতে চান বলে উল্লেখ করেন নি, ফাইলগুলি অনকি বলেছে। find dir/to/delete -type f -delete
সমৃদ্ধ

21
অনুসন্ধান . -ম্যাক্সডেপথ 1-টাইপ চ-এক্সেক্স আরএম -f {} \;

এটি কেবল খুব দীর্ঘ সময় নেয় (প্রতিটি ফাইলের জন্য আরএমের এক এক্সিকিউট)।

এই এক অনেক বেশি দক্ষ:

অনুসন্ধান . -ম্যাক্সডেপথ 1-টাইপ চ-প্রিন্ট 0 | xargs -r0 rm -f

এটি যতটা সম্ভব আরএম এর পক্ষে যতটা ফাইলনামকে ততটুকু যুক্তি দেয়, তারপরে ফাইলের নামের পরবর্তী লোড দিয়ে আরএম চালায় ... এটি ঘটতে পারে যে আরএমকে কেবল 2 বা 3 বার বলা হয়।


5
কেউ কীভাবে কাজ করে তা জানতে পেরে আনন্দিত ... এছাড়াও নতুন gnu ফাইন্ডের -সিলিট অ্যাকশন বা-এক্সেক কমান্ড {} + এর সাথে বিবেচনা করুন যা xargs এর মতো কাজ করে। 'মানুষ খুঁজে' এর ক্রিয়া বিভাগটি দেখুন।
কাইল ব্র্যান্ড্ট 18

আমি -xec cmd {} + সম্পর্কে জানতাম না। এটি বরং দরকারী বলে মনে হচ্ছে। মুছে ফেলার চেয়ে কিছুটা বেশি জেনেরিক :)
ডেভিড

-সিলিটটি ঠিকঠাক হতে পারে তবে আমি ব্যক্তিগতভাবে কমান্ডগুলি পছন্দ করি যা বিভিন্ন মেশিনে ব্যবহার করা যেতে পারে। আমি যে সোলারিস সিস্টেমে কাজ করি তা পুরনো, সুতরাং তাদের উপর কাজ শেষ হবে না
এ্যাসিডমিন

2
যোগ করার পদ্ধতি ioniceঠিক আগে rmএকটা ভাল ধারণা যদি কম্পিউটার একই সময়ে অন্যান্য ব্যক্তিদের দ্বারা ব্যবহৃত হয়।
হুবার্ট কারিও

6

এই উভয়ই সমস্যা গোল হয়ে উঠবে। এখানে প্রতিটি প্রযুক্তির সংশ্লিষ্ট কর্মক্ষমতা বিশ্লেষণ আছে

find . -name WHATEVER -exec rm -rf {} \;

অথবা

ls WHATEVER | xargs rm -rf

সমস্যাটি হ'ল ডিরেক্টরিতে থাকা প্রত্যেকটি আইটেমের সাথে বাশকে "*" প্রসারিত করে। এই উভয় সমাধান পরিবর্তে প্রতিটি ফাইলের মাধ্যমে কাজ করে।


2
সমাধানটি অনেকগুলি ফাইলের সাথে ধীর হয় কারণ এটি প্রতি একক ফাইলের জন্য আরএম কমান্ডটি আহ্বান করে is Xargs সমাধানটি দ্রুততর তবে এটি কেবল তখনই কার্যকর হয় যখন ফাইলের নামগুলিতে ফাঁক না থাকে (অন্যথায় আপনার GNU অনুসন্ধান এবং দরকার হয় find . -print0 | xargs -0 rm)।
রোবকাস্ট

"সন্ধান করুন name নাম WHATVER -print0 | xargs -0 rm -rf" আরও কার্যকর হবে। প্রতিটি ফাইলের জন্য একটি আরএম কাঁটাচামচ করবে, যেখানে xargs এটি সর্বনিম্নে হ্রাস করবে। ফাঁকা জায়গাগুলি সহ ফাইলগুলি মোকাবেলার জন্য আপনার -প্রিন্ট 0 এবং -0 প্রয়োজন find
ডেভিড পাশলে

Ls কমান্ড কাজ করবে না, কারণ এটি "আর্গুমেন্টের তালিকা অনেক দীর্ঘ" দেয়
ব্রেন্ট

2
আপনি " ls *" করছেন , এবং "" *"আপনার শেলটি দীর্ঘায়িত হওয়ার বিষয়ে অভিযোগ করে এমন আর্গুমেন্ট তালিকায় প্রসারিত হয়। ls .পরিবর্তে " " (অথবা একটি ডিরেক্টরি স্তর উপরে যান এবং " ls [dirname]" করুন)।
জেমস স্নেরিংগার

দ্বিতীয় কমান্ড লাইন (ls WHATEVER | xargs rm -rf) একই কারণে কাজ করবে না কারণ প্রশ্নটি কাজ করে না: যাকে শেল দ্বারা একটি অতিরিক্ত
মাত্রায়

3

আমি এক স্তরের ব্যাক আপ করে এটি করতে সক্ষম হয়েছি:

cd ..

এবং চলমান:

rm directory name -rf

এবং তারপরে ডিরেক্টরিটি পুনরায় তৈরি করুন।


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

2

এই সমস্ত অনুরোধগুলি খুব সুন্দর হয় তবে আমি খুব শীঘ্রই খুব তাড়াতাড়ি মনে করি যখন আমি হুট করে থাকি ঠিক নামকরণের প্রয়োজন: পরিবর্তে আমি ls ব্যবহার করি। কেউ যেমন উল্লেখ করেছেন, এলএস। কাজ করবে তবে আমি এলএস -1 পছন্দ হিসাবে করব:

ls -1 | xargs -n 100 rm -rf

-এন এক্সএক্সএক্সএক্স চিত্রটি সর্বাধিক ছাড়িয়ে যাওয়ার সাথে অভিনয় করা বেশ নিরাপদ হয় স্বয়ংক্রিয়ভাবে সংশোধন করা হবে (যদি আকার-সর্বাধিক ছাড়িয়ে যায়; দেখুন -s) অথবা কোনও অ্যাপ্লিকেশনের জন্য যদি আরগস-ম্যাক্স অতিক্রম করা হয় তবে এটি সাধারণত পরিবর্তিত হবে সুস্পষ্ট।

এটি লক্ষ করা উচিত যে গ্রেপ এই চেইনের মাঝখানে সন্নিবেশ করানো সহজ যখন আপনি কেবলমাত্র একটি বৃহত্তর ডিরেক্টরিতে থাকা ফাইলগুলির একটি উপসেট মুছতে চান এবং যে কারণেই সন্ধানটি ব্যবহার করতে চান তা ব্যবহার করবেন না।

এই উত্তরটি ধরে নিয়েছে যে আপনি আপনার এলএস, জার্গস এবং ইত্যাদির জন্য Gnu কোর ইউটিলিটি ব্যবহার করছেন umes


"Ls" কাজ করার জন্য এটি খুব বড় কোনও ডিরেক্টরি দিয়ে কাজ করবে? (একই ত্রুটি - যুক্তি তালিকার তালিকা খুব দীর্ঘ)
ব্রেন্ট

হ্যাঁ ব্রেন্ট: কেবলমাত্র এলএস করার সময় কোনও ফাইলস্পেক ব্যবহার করবেন না তা নিশ্চিত হন be উপরে বর্ণিত হিসাবে কেবল -1 (ড্যাশ ওয়ান) ব্যবহার করুন। এবং উপরে বর্ণিত হিসাবে, ls এর পরে গ্রেপ ব্যবহার করুন যদি আপনার ফাইল তালিকার সাথে জুড়ি করতে হয়। আপনি যদি এলএস দিয়ে কোনও ওয়াইল্ডকার্ড ব্যবহার করছেন না তা নিশ্চিত করার পরে আপনি যদি "খুব দীর্ঘ" ত্রুটি পেয়ে থাকেন তবে সম্ভবত xargs অভিযোগ করছে। 'Xargs -n 100' এর পরিবর্তে 'xargs -n 5' ব্যবহার করুন এবং কিছুটা ধীর গতির হলে আপনার অবশ্যই নিরাপদ থাকা উচিত।
রিক্সটারটেক

1

আপনি এটি ব্যবহার করতে -exec +বিকল্পটি ব্যবহার করতে পারেন যা কোনটি যতবার সম্ভব কয়েকবার rm চালানোর চেষ্টা করবে, যা দ্রুত হতে পারে।

find . -type f -exec rm '{}' +

0

সিস্টেমটি যখন প্রতিক্রিয়াশীল থাকার দরকার হয় তখন প্রচুর সংখ্যক ফাইল মুছে ফেলার জন্য এখানে একটি সংস্করণ।

এটি ছোট ব্যাচে কাজ জারি করে (ডিফল্টরূপে 100 টি ফাইল) এবং অন্যান্য কাজ শেষ হওয়ার জন্য কিছুটা অপেক্ষা করে কাজ করে।

Ext3- তে একক ডিরেক্টরি থেকে অর্ধ মিলিয়ন ফাইল মুছে ফেলার জন্য দুর্দান্তভাবে কাজ করেছেন। এটি সামান্য বোনাস হিসাবে সম্পন্ন শতাংশ মুদ্রণ করে

noOfFiles=`ls -U | wc -l`
n=0
while (ls -U | tail -n 100 | xargs rm -f); do 
   n=$((n+100));
   sync;
   echo -en "$((n*100/noOfFiles))%, ($n of $noOfFiles)\r";
   sleep 5;
done

0

"যুক্তি খুব দীর্ঘ" বা "মেমরি বরাদ্দ করতে পারে না" ত্রুটিগুলি সমাধান করে

এটি সেশন ফোল্ডারে 220,000+ ফাইলগুলিতে কৌশলটি করেছে ...

সুবিধা: তাত্ক্ষণিকভাবে ফাইলগুলি অপসারণ শুরু হয়

সিডি পাথ / টু / ফোল্ডার
ls -f | xargs rm -f -v

ফাইলগুলির স্ক্রিনশট অপসারণের জন্য ক্লিক করুন - (15 মিনিটের সমস্ত ফাইল মুছে ফেলা হয়েছে)

-f (LS পরে) presorting থেকে রাখে

-v (আরএম এর পরে) প্রতিটি ফাইল সরানো হিসাবে প্রদর্শন করে

-f (আরএম পরে) রাইট-সুরক্ষিত ফাইলগুলিতে কোনও প্রম্পট ছাড়াই বাহিনী

টিপ: আপনি যখন ফাইলগুলি মোছার চেষ্টা করছেন তখন অতিরিক্ত স্বয়ংক্রিয় জেনারেট হওয়া ফাইলগুলি যুক্ত হতে প্রথমে ফোল্ডারটির নাম পরিবর্তন করুন (সেশন_ল্ডের প্রাক্তন সেশন) first আপনি যদি আমার ডিরেক্টরি হিসাবে স্বয়ংক্রিয়ভাবে না ঘটে তবে আপনি নিজেই মূল ডিরেক্টরিটি পুনরায় তৈরি করতে পারেন


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