2015-11-28 8 views
5

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

उदाहरण के लिए

: सीमा = 10 - 20

dir1: 
f1 size=12 
f2 size= 19 

dir2: 
f3 size=22 
f4 size=11 

OUTPUT = dir1 

dir2 बाहर रखा गया क्योंकि f3 10-20 सीमा के बाहर है। dir1 को बाहर नहीं रखा गया है, क्योंकि इसकी सभी फाइलों के आकार के अंदर आकार हैं।

+2

'प्रयास करें du' और' awk'। – Cyrus

+3

इस बात पर टिप्पणी किए बिना कि "डु 'और' awk' 'का उपयोग करना बेहतर है या नहीं, आप निश्चित रूप से' खोज 'से जुड़े छद्म-एक-लाइनर के साथ ऐसा कर सकते हैं:' dir1 dir2 में dir के लिए; करें [[-z "$ (ढूंढें" $ dir "-type f \ (-size -10c -o -size + 20c \) 2>/dev/null)"]] &&cho "$ dir"; done'। (आपको आउटपुट के रूप में 'dir1' प्राप्त करना चाहिए।) – 4ae1e1

+1

क्या आपका मतलब निर्देशिका में फ़ाइलों का कुल आकार या एक फ़ाइल का आकार है? – OznOg

उत्तर

2

4ae1e1 की टिप्पणी से उधार कोड:

प्रत्येक कमांड-लाइन-निर्दिष्ट उपनिर्देशिका में नियम (यदि कोई है) का पहला अपवाद पाएं। प्रिंट करें कि अगर इसकी अनुमति है।

dir_filesize_rangefilter() { 
    # args: lo hi paths... 
    # sizes in MiB 
    # return value: dir names printed to stdout 
    local lo=$1 hi=$2 
    shift 2 # "[email protected]" is now just the paths 

    for dir; do # in "[email protected]" is implicit 
     local safedir=$dir 
     [[ $dir = /* ]] || safedir=./$dir # make sure find doesn't treat weird -filenames as -options 
     # find the first file smaller than lo or larger than hi 
     [[ -z "$(find "$safedir" -type f 
       \(-size "-${lo}M" -o -size "+${hi}M" \) 
       -print -quit)" 
     ]] && printf '%s\n' "$dir" 
    done 
} 

मैं "printf" क्योंकि "गूंज" टूट जाता है प्रयोग किया जाता है, तो निर्देशिका नामों में से एक -e या कुछ और के साथ शुरू होता है। यदि आप वास्तव में वैध फ़ाइल नामों के बारे में पागल होना चाहते हैं, तो आप इस सरणी को एक सरणी में निर्देशिका में जोड़ने की अनुमति दे सकते हैं, क्योंकि यदि आप वास्तव में while IFS= read लूप या किसी भी चरित्र को अनुमति देने के लिए इसके आउटपुट को पार्स करना चाहते हैं , और है कि अभी भी dir एक नई पंक्ति युक्त नाम पर टूट जाता है)

जाहिर है तो चलो वाक्य रचना हाइलाइटिंग $(command substitution) अंदर के भावों का हवाले से नियम नहीं जानता है:।/

+1

डैश से शुरू होने वाली बेवकूफ निर्देशिका नामों की बात करते हुए, वे 'find' तोड़ देंगे ... इसलिए './$ dir' का उपयोग करके यदि यह पूर्ण नहीं है तो शायद बेहतर है। – 4ae1e1

+0

@ 4ae1e1: अच्छी पकड़; तय की। मैं दो-चरणीय अस्थायी सशर्त असाइनमेंट के बिना इसे करने के लिए एक चालाक '$ {dir/pattern/replace} 'विस्तार के बारे में नहीं सोच सका। –

+0

'$ {dir /#-/./-}'? वैसे भी, मेरे स्वाद के लिए थोड़ा सा हैकिश। मैं सब वर्बोज़ के लिए अभी भी स्वयं दस्तावेज कोड के लिए हूँ। – 4ae1e1

1

यहां 3 लाइनों में एक संभावित समाधान है। du -hat -3M > sm.dat

: एक अलग फाइल में du -hat 1M > gr.dat

  • सभी फाइलों की सूची 3MB की तुलना में छोटे: एक फ़ाइल में

    1. 1MB से अधिक से अधिक सभी फाइलों की सूची: मैं एक ठोस उदाहरण में दे

    2. उपयोग दोनों उत्पन्न फ़ाइलों में मैच खोजने के लिए ग्रेप: grep -F -x -f gr.dat sm.dat

  • +0

    उस निर्देशिका में पाता है जिनमें कम से कम एक अनुमत फ़ाइल है, न कि केवल * अनुमत फ़ाइलों वाली निर्देशिकाएं। टिप्पणियों में सुझाए गए 4ae1e1 की तरह, आप एक सूची अस्वीकृत फाइलें उत्पन्न कर सकते हैं, और उसके बाद केवल उन निर्देशिकाओं को मुद्रित कर सकते हैं जिनमें से कोई भी शामिल नहीं है। –

    +0

    सच है, यह इंगित करने के लिए धन्यवाद! – proteus

    संबंधित मुद्दे