जब यह "तर्क सूची बहुत लंबी" रिपोर्ट करता है, तो मैं एक निर्देशिका से सभी फ़ाइलों को कैसे हटा सकता हूं


11

मेरे पास एक निर्देशिका है जिसमें दो सौ हजार फाइलें हैं।

मैं सभी फ़ाइलों को हटाना चाहता हूं, लेकिन rm * -f रिपोर्ट: "तर्क सूची बहुत लंबी है"

इस निर्देशिका को खाली करने का सबसे अच्छा तरीका क्या है?


संबंधित, अर्ध-डुप्लिकेट: unix.stackexchange.com/questions/37329/…
मिया

जवाबों:


11

घटना में आप निर्देशिका को हटा नहीं सकते, आप हमेशा खोज का उपयोग कर सकते हैं।

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

वह वर्तमान निर्देशिका में सभी फ़ाइलें हटा देगा, और केवल वर्तमान निर्देशिका (उपनिर्देशिका नहीं)।


लगभग सही (मेरी पोस्ट भी देखें)
asdmin

2
Linux पर आप इसे "+" के बजाय "+" का उपयोग करके और भी तेज़ी से कर सकते हैं। यह एक बार में "आरएम" प्रति अधिक फ़ाइलों को हटाने का कारण होगा।
थॉमस

5
और भी तेज: find dir/to/delete -delete( rmहटाने के लिए प्रति फ़ाइल एक प्रक्रिया नहीं करता है )।
मोर्टन सिबूहर

मोर्टन: उन्होंने कभी निर्देशिका को हटाने की इच्छा नहीं जताई, एह फाइलों पर कहा। find dir/to/delete -type f -delete
रिचो

21
खोजो। -Maxdepth 1 -टाइप f -exec rm -f {} \;

यह बस बहुत लंबा (आरएम प्रति फ़ाइल का एक निष्पादन) लेता है।

यह बहुत अधिक कुशल है:

खोजो। -मैक्सडीप 1 -टाइप f -print0 | xargs -r0 rm -f

जितना संभव हो उतना rm फाइल करने में तर्क के रूप में rm जितना संभव है, तो rm फिल्म्स के अगले लोड के साथ चलाता है ... ऐसा हो सकता है कि rm को केवल 2 या 3 बार कहा जाता है।


5
किसी को यह देखने में खुशी होती है कि कैसे पता चलता है कि कैसे काम करता है ... नए गन्नू के साथ विचार करें -delete क्रिया या -exec कमांड {} + जो xargs की तरह कार्य करता है। 'आदमी ढूंढो' के एक्शन अनुभाग देखें।
काइल ब्रान्ड

मैं -xec cmd {} + के बारे में नहीं जानता था। बल्कि उपयोगी लगता है। -दिल्ली से थोड़ा अधिक सामान्य :)
डेविड पशले

-प्लेट ठीक हो सकता है, लेकिन मैं व्यक्तिगत रूप से उन कमांड को पसंद करता हूं जो विभिन्न प्रकार की मशीनों पर उपयोग किए जा सकते हैं। सोलारिस सिस्टम जो मेरे साथ काम करते हैं वे पुराने हैं, इसलिए वे उन पर काम नहीं करेंगे
asdmin

2
यदि कंप्यूटर का उपयोग उसी समय में अन्य लोगों द्वारा किया जाता है, तो ioniceपहले जोड़ना rmएक अच्छा विचार है।
ह्यूबर्ट करियो

6

इन दोनों को समस्या का दौर मिलेगा। यहाँ पर प्रत्येक तकनीक के संबंधित प्रदर्शन का विश्लेषण है

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

या

ls WHATEVER | xargs rm -rf

समस्या निर्देशिका में प्रत्येक आइटम के साथ "*" विस्तार से टकराती है। ये दोनों समाधान बदले में प्रत्येक फ़ाइल के माध्यम से काम करते हैं।


2
खोज समाधान कई फ़ाइलों के साथ धीमा है क्योंकि यह हर एक फ़ाइल के लिए rm कमांड को आमंत्रित करता है। Xargs समाधान तेज़ है, लेकिन यह केवल तभी काम करता है जब फ़ाइलनाम में स्थान न हों (अन्यथा आपको GNU खोजने और find . -print0 | xargs -0 rm) की आवश्यकता होती है ।
लूटना

"Find -name WHATEVER -print0। xargs -0 rm -rf" अधिक कुशल होगा। हर फ़ाइल के लिए एक rm कांटा मिलेगा, जहाँ xargs इसे न्यूनतम तक घटा देगा। आपको -प्रिंट0 और -0 की आवश्यकता है ताकि आप रिक्त स्थान के साथ फ़ाइलों का सामना कर सकें। आप शायद खोज पर -depth का उपयोग करना चाहते हैं, इसलिए यह पहली खोज को गहराई देता है।
डेविड पशले

Ls कमांड काम नहीं करेगा, क्योंकि यह भी "तर्क सूची बहुत लंबी है"
ब्रेंट

2
आप " ls *" कर रहे हैं , और " *" तर्क सूची में फैलता है कि आपका शेल बहुत लंबा होने के बारे में शिकायत करता है। ls .इसके बजाय " " करें (या एक निर्देशिका स्तर ऊपर जाएं और " ls [dirname]" करें)।
जेम्स स्नेनरिंग

दूसरी कमांड लाइन (ls WHATEVER | xargs rm -rf) एक ही कारण से काम नहीं करेगी क्योंकि सवाल काम नहीं करता है:
WHATEVER

3

मैं एक स्तर का समर्थन करके ऐसा करने में सक्षम था:

cd ..

और चल रहा है:

rm directory name -rf

और फिर डायरेक्टरी बना रहे हैं।


1
यह तभी काम करता है जब आपके पास स्थायी रूप से dir न हो और सभी फाइलें और निर्देशिकाएं पुन: हटा दी जाएं। मेरे जीवन के अधिकांश मामले, इस तरह से काम नहीं करते।
asdmin

2

इन सभी को लगता है कि इनवोकेशन बहुत अच्छा है, लेकिन मुझे शायद ही कभी याद हो कि नामकरण की जरूरत तब पड़ती है जब मैं जल्दी में होता हूं: इसके बजाय मैं एसएस का उपयोग करता हूं। जैसा कि कोई उल्लेख करता है, एल.एस. काम करेगा, लेकिन मैं ls -1 को पसंद करता हूं:

एलएस -1 | xargs -n 100 rm -rf

-N xxx आंकड़ा चारों ओर से खेलने के लिए बहुत ही सुरक्षित है क्योंकि अधिकतम या तो ऑटो-सही हो जाएगा (यदि आकार-अधिकतम पार हो गया है; देखें -s) या यदि किसी ऐप के लिए आर्ग-अधिकतम पार हो गया है तो यह आमतौर पर नहीं होगा स्पष्ट।

यह ध्यान दिया जाना चाहिए कि grep इस श्रृंखला के मध्य में सम्मिलित करना आसान है जब आप केवल एक बड़ी निर्देशिका में फ़ाइलों का एक सबसेट हटाना चाहते हैं, और जो भी कारण ढूंढना चाहते हैं उसका उपयोग न करें।

यह उत्तर मानता है कि आप अपने ls, xargs और आदि के लिए ग्नू कोर उपयोगिताओं का उपयोग कर रहे हैं।


क्या यह एक निर्देशिका के साथ काम करेगा जो काम करने के लिए "ls" के लिए बहुत बड़ी है? (वही त्रुटि - तर्क सूची बहुत लंबी है)
ब्रेंट

हाँ ब्रेंट: बस सुनिश्चित करें कि ls को इनवॉइस करते समय फिल्स्पेक का उपयोग न करें। जैसा कि ऊपर दिखाया गया है, सिर्फ -1 (डैश वन) का उपयोग करें। और जैसा कि ऊपर बताया गया है, अगर फ़ाइल सूची को नीचे रखना है तो ls के बाद grep का उपयोग करें। यदि आपको यह सुनिश्चित करने के बाद "बहुत लंबी" त्रुटि मिल रही है कि आप किसी वाइल्डकार्ड का उपयोग नहीं कर रहे हैं, तो शायद 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

निकाले जा रहे फ़ाइलों के स्क्रीनशॉट के लिए क्लिक करें - (15min में सभी फाइलें हटा दी गईं)

-f (ls के बाद) प्रिस्क्रिप्शन से रहता है

-v (rm के बाद) प्रत्येक फ़ाइल को हटाए जाने के रूप में प्रदर्शित करता है

-f (rm के बाद) राइट-प्रोटेक्टेड फाइल्स पर बिना किसी प्रॉम्प्ट के फोर्स करता है

युक्ति: जब आप फ़ाइलों को हटाने का प्रयास कर रहे हों, तब अतिरिक्त ऑटोगेन्ज़र्ड फ़ाइलों को जोड़े रखने के लिए पहले फ़ोल्डर (सेशन_ सेशन से पूर्व) का नाम बदलें । यदि आप मेरे मामले में स्वचालित रूप से नहीं करते हैं तो आप मूल निर्देशिका को रीमेक कर सकते हैं


आपके उत्तर में नया क्या है जो पिछले वाले से गायब था?
user2233709
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.