उन फ़ाइलों को पुन: हटा दें, जिनका आकार 1MB से कम है


13

मैं उन फ़ाइलों को कैसे हटा सकता हूं, जो किसी निर्देशिका से 1MB से कम आकार की हैं?


जवाबों:


21

इसके साथ किया जा सकता है find:

find . -type f -size -1M -exec rm {} +

ध्यान दें कि यह पुनरावर्ती उपनिर्देशिका में उतरेगा, और बिना शर्त 1 मेगाबाइट से छोटी सभी फ़ाइलों को हटा देगा। सावधान रहे।


आपको पथ तर्क याद आ रहा हैfind

@ समर्थन: यह GNU है find। :)
स्वेन मार्नाच

2
@ डैनियलएंडरसन: findसिस्टम की सीमा में फिट होने के लिए बुलाए जाने वाले तर्कों की संख्या को सीमित करता है, इसके विपरीत rm *, जो एकल प्रक्रिया मंगलाचरण है। यदि आवश्यक हो तो findकई उदाहरणों को लागू करेगा rm। और मुझे पूरा यकीन है कि विशेष पात्रों को सही ढंग से व्यवहार किया जाता है, जिसमें न्यूलाइन वर्ण भी शामिल हैं। मैं लचीलेपन के कारणों -exec rmसे अधिक पसंद करता हूं -delete- उदाहरण के लिए, बाद वाला लिखने-संरक्षित फ़ाइलों को हटाने का कोई तरीका नहीं देता है।
स्वेन मार्नाच

1
@Invoker: जब से यह गलत था मैंने आपके परिवर्तन को वापस कर दिया। -1Mवांछित से कम एक मेगाबाइट का मतलब है। आपका संस्करण आकार में बिल्कुल एक मेगाबाइट के साथ सभी फ़ाइलों को हटा देगा, जो कि कुछ हद तक बिना ऑपरेशन के लगता है।
स्वेन मार्नाच

2
रुचि रखने वाले किसी व्यक्ति के लिए, यदि आप 1M से अधिक की सभी फ़ाइलों को हटाना चाहते हैं, तो कमांड का उपयोग करें find . -type f -size +1M -exec rm {} +। -1M के बजाय + 1M पर ध्यान दें।
चेसोफर्नेड

10

यह काम करना चाहिए:

$ find <directory> -type f -size -1M -delete

मुझे नहीं लगता कि हमें 1M से हाइफ़न निकालने की ज़रूरत है।
आक्रमणकारी

2
@ इंवोकर, मेरा मानना ​​है कि -साइन एक माइनस साइन है जिसका अर्थ है "1M से कम"। यदि आप चलाते हैं find <directory> -type f -size +1M -deleteतो आप 1M से बड़ी सभी फ़ाइलों को हटा देंगे ।
चेसोफेनरड

हाँ, आप सही हैं मेरे बुरे
Invoker

2

बस विविधता के लिए और एक संभव (शायद मामूली) प्रदर्शन लाभ:

find <directory> -type f -size -1M -print0  | xargs -0 rm

यह तेजी से कैसे माना जाता है? यह एक अतिरिक्त xargsप्रक्रिया शुरू करता है।
स्वेन मार्नाच

अब आपके पास एक ही ब्लॉक डिवाइस के लिए दो सीपीयू हो सकते हैं ! अधिक समझदारी से, स्टेट / रीडिर ऑपरेशन को अनलिंक ऑपरेशन द्वारा सिंक्रोनाइज़ नहीं किया जाता है। क्या यह बेहतर होने की संभावना है स्पष्ट रूप से उप-आकार, फ़ाइलों की संख्या, डिवाइस आदि पर निर्भर करता है

1

प्रयत्न

खोजो। -साइज़ -1M -exec rm {} \;


1
यह गैर-जीएनयू उपयोगकर्ताओं के लिए बहुत अच्छा है। धन्यवाद! @ स्वेन के उत्तर के समान, लेकिन \;इसके बजाय अंत में+
हैमक्स -0r

-1

आप इस लिंक की जाँच कर सकते हैं http://ayaz.wordpress.com/2008/02/05/bash-quickly-de हटाना-empty-files-in-a-directory / , यह वही है जो आप चाहते हैं।

for file in *;
  do
    file_size=$(du $file | awk '{print $1}');
    if [ $file_size == 0 ]; then
        echo "Deleting empty file $file with file size $file_size!";
        echo "rm -f $file";
    fi;
done

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


SO पर उत्तर स्व-सम्‍मिलित होने चाहिए - केवल एक लिंक पोस्ट न करें। (इसके अलावा, लिंक की गई पोस्ट का कोड 1M से छोटी फाइलों के बजाय खाली फाइलों को हटा देता है।)
स्वेन मार्नाच

@SvenMarnach दिए गए कोड उदाहरण लिंक में हम $ file_size <1M का उपयोग नहीं कर सकते।

नहीं, हम नहीं कर सकते, क्योंकि शेल समझ में नहीं आएगा 1M
स्वेन मार्नाच

1M से मेरा मतलब था 1048576 1MB को बाइट में

1
ठीक है, अगर आप परीक्षण करते हैं कि क्या यह वास्तव में काम करता है और कोड को आपके उत्तर में कॉपी करता है, तो यह एक एसओ उत्तर बन सकता है।
स्वेन मार्नाच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.