निर्देशिका और उपनिर्देशिकाओं में सभी शून्य-बाइट फ़ाइलें खोजें


82

मैं एक निर्देशिका और उसकी उपनिर्देशिकाओं में सभी शून्य-बाइट फ़ाइलों को कैसे ढूँढ सकता हूं?

मैंने यह कर दिया:

#!/bin/bash
lns=`vdir -R *.* $dir| awk '{print $8"\t"$5}'`
temp=""
for file in $lns; do
    if test $file = "0"; then
        printf $temp"\t"$file"\n"
    fi
    temp=$file
done

लेकिन, मुझे केवल वर्तमान निर्देशिका में परिणाम मिलते हैं, उप-संस्करण नहीं, और यदि किसी फ़ाइल नाम में कोई स्थान होता है, तो मुझे टैब पर केवल पहली बार मिलता है


1
आप पढ़ना पसंद कर सकते हैं man find
अल्क

1
प्रश्न यूनिक्स और लिनक्स पर भी पोस्ट किया गया - कृपया एक ही प्रश्न को कई स्थानों पर पोस्ट न करें।
ग्लेन जैकमैन

अगली बार जब मैं अपने ब्राउज़र में समस्या के कारण इस तरह की पुनरावृत्ति नहीं करूंगा, तो स्टैकओवरफ्लो के साथ मैं सुपरसुअर में पोस्ट किया जा सकता है, लेकिन अब इतिहास कुकीज़ और कैटच को साफ करके तय की गई समस्या इसलिए मैंने फिर से यहां पूछा
सिवा

जवाबों:


174

$ 0 से कम आकार की सभी फ़ाइलों के नाम प्रिंट करने के लिए:

find "$dir" -size 0

ध्यान दें कि सभी कार्यान्वयन findडिफ़ॉल्ट रूप से उत्पादन नहीं करेंगे, इसलिए आपको ऐसा करने की आवश्यकता हो सकती है:

find "$dir" -size 0 -print

प्रश्न में अंतिम लूप पर दो टिप्पणियाँ:

एक स्ट्रिंग में हर दूसरे शब्द पर पुनरावृत्ति करने के बजाय और यह देखें कि क्या वैकल्पिक मान शून्य हैं, आप लाइनों पर पुनरावृति करके व्हाट्सएप के साथ होने वाली समस्या को आंशिक रूप से समाप्त कर सकते हैं। उदाहरण के लिए:

printf '1 f1\n0 f 2\n10 f3\n' | while read size path; do
    test "$size" -eq 0 && echo "$path"; done

ध्यान दें कि यह आपके मामले में विफल हो जाएगा यदि ls द्वारा किसी भी पथ आउटपुट में newlines होते हैं, और यह 2 बिंदुओं को पुष्ट करता है: पार्स न करें ls, और एक ऐसा नामकरण नीति है जो पथों में व्हाट्सएप की अनुमति नहीं देती है।

दूसरे, लूप से डेटा को आउटपुट करने के लिए, आउटपुट को केवल एक चर में स्टोर करने की आवश्यकता नहीं echoहै। यदि आप बस लूप को स्टडआउट करने के लिए अपना आउटपुट लिखते हैं, तो आप एक ही बात को पूरा करते हैं लेकिन इसे स्टोर करने से बचें।


क्या मैं * .xml के अलावा किसी निर्देशिका को फ़िल्टर कर सकता हूं
Civa

2
एक सुविधाजनक -emptyविकल्प भी है ।
वेस्ले बाउ

@EsleyBaugh के साथ खाली विकल्प आप भी अंदर शून्य फ़ाइलों के साथ निर्देशिकाओं
इगोर Scabini

1
@IgorScabini यदि आप उन फ़ाइलों तक सीमित करना चाहते हैं जिनके साथ आप ऐसा कर सकते हैं -type f
वेस्ले बो

लवली! सरल और सटीक। यार, मैं इस findकमांड का पर्याप्त उपयोग नहीं करता । मैं वास्तव में यह पता लगाने के अपने डर पर काबू पाने के लिए है। तो उपयोगी है।
racl101

32

उपरोक्त उत्तरों के अतिरिक्त:

यदि आप उन फ़ाइलों को हटाना चाहते हैं

find $dir -size 0 -type f -delete

1
हर समय 0 आकार की सभी फ़ाइल को हटाना आवश्यक नहीं है।
राघवेंद्र

उसके बाद 0
राघवेंद्र

-exec /bin/rm {} \; या -exec /bin/rm {} + गैर-जीएनयू findकार्यान्वयन पर भी काम करेगा , जो गैर-मानक विस्तार का समर्थन नहीं करता है-delete
गर्ट वैन डेन बर्ग


3

बैश 4+ परीक्षण किया गया - यह आकार 0 की खोज करने का सही तरीका है:

find /path/to/dir -size 0 -type f -name "*.xml"

आकार 0 के कई फ़ाइल एक्सटेंशन खोजें:

find /path/to/dir -size 0 -type f \( -iname \*.css -o -iname \*.js \)

नोट: यदि आपने \ (... \) को निकाल दिया, तो परिणाम उन सभी फ़ाइलों के होंगे जो इस आवश्यकता को पूरा करती हैं इसलिए आकार 0 की अनदेखी कर रही है।


-inameमानक विकल्पों की सूची के लिए यहाँfind देखें के कुछ गैर-जीएनयू कार्यान्वयनों के लिए पोर्टेबल नहीं है
गर्ट वैन डेन बर्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.