कमांड लाइन के माध्यम से 0 बाइट्स की फ़ाइलों को आकार में निकालें?


16

इसलिए, मुझे अन्य निर्देशिकाओं से भरी एक निर्देशिका मिली, और मैं सोच रहा था कि क्या उन फ़ाइलों को निकालना संभव है जिनका कोई आकार नहीं है। आम तौर पर ये फाइलें 0 बाइट्स होती हैं और चूंकि मैं इन सभी उपखंडों का विलय करना चाहता हूं, इसलिए मैं पूरी तरह से वैध फाइल को एक भारहीन 0 बाइट फाइल के साथ बदल सकता हूं, और वहां मेरी कानूनी फाइल जाती है। शून्य बाइट फ़ाइलों को हटाने का कोई तरीका?

जवाबों:


34

का प्रयोग करें ढूँढें आकार से फ़ाइलें खोजने के लिए और मानक आउटपुट में फ़ाइल नाम मुद्रित करने के लिए आदेश।

find . -type f -size 0b -print

स्थानापन्न -printके साथ -deleteफ़ाइलों को हटाने के बजाय स्क्रीन पर उन्हें मुद्रित करने के लिए।

find . -type f -size 0b -delete

अब, क्या फ़ाइलों को एक स्थान से दूसरे स्थान पर ले जाने का कोई तरीका है, और संघर्षों के साथ यदि आकार समान है, लेकिन आकार अलग है तो दोनों प्रतियों को रखें?
1924 में user245115

यह rsync के लिए एक नौकरी की तरह लगता है ।

7
आप उपयोग कर सकते हैं -emptyके बजाय -size 0b
केविन

6

खोजें और 0 के आकार के साथ सभी फ़ाइलों को हटा दें:

find . -type f -size 0 -print0 | xargs -I{} -0 rm {}

उदाहरण:

% ls -og   
total 4
-rw-rw-r-- 1 0 Jun  7 20:31 bar
-rw-rw-r-- 1 5 Jun  7 20:29 foo

% find . -size 0 -print0 | xargs -I{} -0 rm {}

% ls -og                                      
total 4
-rw-rw-r-- 1 5 Jun  7 20:29 foo

4

आप इसे सीधे शेल में भी कर सकते हैं। यह उपयोगी हो सकता है यदि आप खाली छिपी हुई फ़ाइलों (जिनके नाम से शुरू होता है .) को हटाना नहीं चाहते हैं । हालांकि आप ऐसा कर सकते हैं, साथ findही शेल का उपयोग करने के लिए एक विकल्प होगा:

shopt -s globstar
for file in **/*; do [ ! -s "$file" ] && [ -f "$file" ] && rm "$file"; done

व्याख्या

  • shopt -s globstar: बैश के लिए ग्लोबस्टार विकल्प को चालू करता है जो **मैच को एक या अधिक उपनिर्देशिका बनाता है । **/*वर्तमान निर्देशिका और उसके सभी उपनिर्देशिकाओं में सभी फाइलों और निर्देशिकाओं का मिलान करेगा।
  • for file in **/*; do ...; done : पाया सभी फ़ाइलों और निर्देशिकाओं पर iterate;
  • [ ! -s "$file" ]: [ -s "$file" ]यदि फ़ाइल मौजूद है और खाली नहीं है तो सही है। इसलिए, यदि फ़ाइल मौजूद नहीं है या यदि वह खाली है तो परीक्षण [ ! -s "$file" ]को !उलटा करता है)।
  • [ -f "$file" ]: यदि फ़ाइल एक नियमित फ़ाइल है तो सच है। डायरेक्टरी या डिवाइस फाइल या सिमिलिंक आदि नहीं।
  • rm "$file" : फाइल को डिलीट करें।

&&यह सुनिश्चित करें कि अगले आदेश केवल तभी पिछले एक सफल रहा था तो यह केवल खाली, नियमित रूप से फ़ाइलें भी हट जाएँगी चलाया जाता है।


और मुझे लगा, मेरा उत्तर जटिल है :) +1
AB

2

यद्यपि ऊपर दिया गया अधिकांश उत्तर सही है, इस आदेश के लिए एक नज़र डालें:

0 बाइट आकार की फ़ाइल का अर्थ है खाली फ़ाइल

हालाँकि आप इस आदेश को चला सकते हैं:

find . -type f -empty -delete

यह सभी खाली फ़ाइलों को हटा देगा।

आप उन फ़ाइलों को हटाने से पहले देख सकते हैं:

find . -type f -empty

उबंटू 14.04 एलटीएस पर, बिना -type f, -emptyखाली निर्देशिकाओं को भी हटा देगा। बस मैन पेज चेक किया।
बलूश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.