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


मेरे पास इसमें कुछ सौ हजार फाइलें हैं।

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

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


11
2017-07-24 15:58


मूल


संबंधित, अर्ध-डुप्लिकेट: unix.stackexchange.com/questions/37329/... - Denilson Sá Maia


जवाब:


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

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

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


11
2017-07-24 16:08



लगभग सही (मेरी पोस्ट भी देखें) - asdmin
लिनक्स पर आप "\" "के बजाय" + "का उपयोग कर इसे और भी तेज़ कर सकते हैं। इससे एक बार में "आरएम" प्रति अधिक फाइलें निकालेंगी। - Thomas
और भी तेज: find dir/to/delete -delete (एक स्पॉन नहीं करता है rm प्रति फ़ाइल को हटाने के लिए प्रक्रिया)। - Morten Siebuhr
मोर्टन: उन्होंने कभी भी निर्देशिका को हटाने की इच्छा नहीं दी, आह ने फाइलों को ऑनकी कहा। find dir/to/delete -type f -delete - richo


ढूंढो -मैक्सडेपथ 1-प्रकार f -exec आरएम-एफ {} \;

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

यह एक और अधिक कुशल है:

ढूंढो -मैक्सडेपथ 1-प्रकार f -print0 | xargs -r0 आरएम-एफ

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


21
2017-07-24 17:52



किसी को यह देखने में खुशी हुई कि कैसे काम करता है ... नए gnu खोज की-डीलीट एक्शन या -exec कमांड {} + के साथ भी विचार करें जो xargs की तरह कार्य करता है। 'मैन ढूंढ' के क्रिया अनुभाग देखें। - Kyle Brandt♦
मुझे -exec cmd {} + के बारे में पता नहीं था। यह बल्कि उपयोगी लगता है। -डिटल से थोड़ी अधिक सामान्य :) - David Pashley
-डिलीट ठीक हो सकता है, लेकिन मैं व्यक्तिगत रूप से कमांड पसंद करता हूं जिसका उपयोग विभिन्न प्रकार की मशीनों पर किया जा सकता है। जिन सौर मंडल के साथ मैं काम करता हूं वे पुराने होते हैं, इसलिए -डिलेट उन पर काम नहीं करेगा - asdmin
जोड़ा जा रहा है ionice तुरंत पहले rm एक अच्छा विचार है कि कंप्यूटर एक ही समय में अन्य लोगों द्वारा उपयोग किया जाता है। - Hubert Kario


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

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

या

ls WHATEVER | xargs rm -rf

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


6
2017-07-24 16:05



खोज समाधान कई फ़ाइलों के साथ धीमा है क्योंकि यह प्रत्येक फ़ाइल के लिए आरएम कमांड को आमंत्रित करता है। Xargs समाधान तेज़ है लेकिन यह केवल तब काम करता है जब फ़ाइल नामों में रिक्त स्थान नहीं होते हैं (अन्यथा आपको जीएनयू ढूंढने की आवश्यकता होती है और find . -print0 | xargs -0 rm)। - robcast
"ढूंढें। -नाम WHATEVER -print0 | xargs -0 rm -rf" अधिक कुशल होगा। प्रत्येक फ़ाइल के लिए एक आरएम फोर्क होगा, जहां xargs इसे न्यूनतम तक कम कर देगा। रिक्त स्थान वाली फ़ाइलों से निपटने के लिए आपको -print0 और -0 की आवश्यकता है। आप संभवतः खोज पर डिप्थ का उपयोग करना चाहते हैं, इसलिए यह पहली बार गहराई से खोज करता है। - David Pashley
Ls कमांड काम नहीं करेगा, क्योंकि वह भी "तर्क सूची बहुत लंबा" देता है - Brent
आप कर रहे हैं "ls *", और यह "*"तर्क सूची में विस्तार करता है कि आपका खोल बहुत लंबा होने के बारे में शिकायत करता है।"ls ."इसके बजाय (या एक निर्देशिका स्तर ऊपर जाएं और करें"ls [dirname]")। - James Sneeringer
दूसरी कमांड लाइन (एलएस WHATEVER | xargs rm -rf) उसी कारण से काम नहीं करेगी क्योंकि सवाल काम नहीं करता है: WHATEVER को खोल से अधिक लंबाई तक प्रतिस्थापित किया जाएगा - asdmin


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

cd ..

और चल रहा है:

rm निर्देशिका का नाम -rf

और फिर निर्देशिका को फिर से बनाते हैं।


3
2017-07-24 16:01



यह केवल तभी काम करता है जब आपको स्थायी रूप से डीआईआर नहीं रखना पड़ेगा और सभी फाइलें और निर्देशिकाओं को रिकर्सली हटा दिया जाएगा। मेरे जीवन में ज्यादातर मामलों में, इस तरह से काम नहीं किया होता। - asdmin


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

एलएस -1 | xargs -n 100 आरएम-आरएफ

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

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

यह जवाब मानता है कि आप अपने एलएस, xargs और आदि के लिए जीएनयू कोर यूटिलिटीज का उपयोग कर रहे हैं।


2
2017-07-28 13:02



क्या यह ऐसी निर्देशिका के साथ काम करेगा जो काम करने के लिए "एलएस" के लिए बहुत बड़ा है? (एक ही त्रुटि - बहस सूची बहुत लंबी है) - Brent
हां ब्रेंट: बस सुनिश्चित करें कि एलएस का आविष्कार करते समय फाइलस्पेक का उपयोग न करें। ऊपर दिखाए गए अनुसार -1 (डैश वन) का प्रयोग करें। और जैसा ऊपर बताया गया है, यदि आपको फ़ाइल सूची को जोड़ना है तो ls के बाद grep का उपयोग करें। यदि आपको यह सुनिश्चित करने के बाद "बहुत लंबा" त्रुटि मिल रही है कि आप एलएस के साथ किसी भी वाइल्डकार्ड का उपयोग नहीं कर रहे हैं, तो शायद xargs शिकायत कर रहा है। 'Xargs -n 100' के बजाय 'xargs -n 5' का प्रयोग करें और थोड़ा धीमा होने पर आपको निश्चित रूप से सुरक्षित होना चाहिए। - rixtertech


आप इसका उपयोग कर सकते हैं -exec + विकल्प खोजने के लिए जो कि आरएम को जितनी बार संभव हो सके चलाने की कोशिश करेगा, जो तेज़ हो सकता है।

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

1
2017-07-28 08:30





सिस्टम को उत्तरदायी रहने की आवश्यकता होने पर बड़ी संख्या में फ़ाइलों को हटाने के लिए यहां एक संस्करण दिया गया है।

यह छोटे बैचों में काम जारी करके काम करता है (डिफ़ॉल्ट रूप से 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
2018-04-26 16:15





"तर्क बहुत लंबा" या "स्मृति आवंटित नहीं कर सकता" त्रुटियों को हल करता है

यह चाल चल रही थी 220,000+ फाइलें सत्र फ़ोल्डर में ....

लाभ: तुरंत फ़ाइलों को हटाने शुरू होता है 

सीडी पथ / से / फ़ोल्डर
एलएस-एफ | xargs आरएम-एफ-वी

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

-f  (एलएस के बाद)presorting से रहता है

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

-f  (आरएम के बाद) लिखने-सुरक्षित फ़ाइलों पर कोई संकेत नहीं के माध्यम से बल देता है

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


0
2018-02-16 09:53



आपके उत्तर में नया क्या है जो पिछले लोगों से गुम था? - user2233709