2012-12-15 14 views
6

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

तो मैं बना दिया है पहले दो मामलों:

आकार द्वारा क्रमबद्ध

RESULTS=`find $CATALOG -size +$SIZE | sort -n -r | sed 's_.*/__'` 

नाम द्वारा क्रमबद्ध करें

RESULTS=`find $CATALOG -size +$SIZE | sed 's_.*/__' | sort -n ` 

लेकिन मैं पता नहीं कैसे परिणामों को सॉर्ट करने के लिए है अंतिम संशोधन तिथि से।

किसी भी मदद की सराहना की जाएगी।

+0

भी देखें सुपर पर (http://superuser.com/q/204564/173513) [कैसे मुझे लगता है कि बड़ी हो गई हैं फ़ाइलें/एक्स बाइट्स की तुलना में छोटे मिल सकती है?] उपयोगकर्ता। – jww

+0

मुझे वास्तव में एक प्रश्न का उत्तर मिला जो मैं इस सवाल में पूछने जा रहा था (एक निश्चित आकार में फाइल ढूंढना) - धन्यवाद :-) – markc

उत्तर

11

सर्वोत्तम तरीकों में से एक, बशर्ते आपके पास बहुत अधिक फ़ाइलें न हों, तो ls का उपयोग सॉर्टिंग करने के लिए करें। आकार से

find $CATALOG -size +$SIZE -exec ls -1 {} + 

क्रमबद्ध और प्रत्येक पंक्ति में एक फ़ाइल को मुद्रित:

find $CATALOG -size +$SIZE -exec ls -S1 {} + 

संशोधन समय द्वारा क्रमबद्ध करें और प्रत्येक पंक्ति में एक फ़ाइल को मुद्रित:

नाम और प्रिंट प्रति पंक्ति एक फ़ाइल द्वारा क्रमबद्ध करें

find $CATALOG -size +$SIZE -exec ls -t1 {} + 

आप ls स्विच के साथ भी खेल सकते हैं: संशोधन समय (छोटा पहले) w द्वारा क्रमबद्ध करें ith लंबे प्रारूप लिस्टिंग, मानव पठनीय आकारों के साथ:

find $CATALOG -size +$SIZE -exec ls -hlrt {} + 

ओह, तुम केवल find फ़ाइलों के लिए चाहते हो सकता है (और निर्देशिका की अनदेखी):

find $CATALOG -size +$SIZE -type f -exec ls -hlrt {} + 

अंत में, कुछ टिप्पणी: पूंजीकृत चर से बचें बैश में नाम (इसे खराब अभ्यास माना जाता है) और टिक टिक से बचें, इसके बजाय $(...) का उपयोग करें। उदा।,

results=$(find "$catalog" -size +$size -type f -exec ls -1rt {} +) 

इसके अलावा, आप शायद सभी परिणामों को पिछले पंक्ति की तरह एक स्ट्रिंग में नहीं रखना चाहते हैं। आप शायद परिणाम को सरणी में रखना चाहते हैं।उस मामले में, इस तरह mapfile का उपयोग करें:

mapfile -t results < <(find "$catalog" -size +$size -type f -exec ls -1rt {} +) 
+0

धन्यवाद, बहुत उपयोगी और संपूर्ण उत्तर। –

+1

मुझे हमेशा आश्चर्य होता है कि अगर पता लगाने के बजाय कमांड का इस्तेमाल किया जा सकता है तो यह कैसे ठंडा हो सकता है। अंगूठे के नियम के रूप में यह खोजने से बहुत तेज़ काम करता है। दुर्भाग्यवश इसमें "-exec" विकल्प नहीं है ( – Tebe

1

xargs का प्रयास करें (जो कुछ भी करते हैं STDIN तर्कों की सूची के रूप में इलाज) और ls करने के लिए -t और -r झंडे। अर्थात कुछ इस तरह:

find $CATALOG -size +$SIZE | xargs ls -ltr 

है कि आप अंतिम संशोधन दिनांक के अनुसार क्रमबद्ध फ़ाइलों दे देंगे।

एक साथ कई विशेषताओं द्वारा क्रमबद्ध करना खोल उपयोगिता और पाइप के साथ वास्तव में अजीब होने वाला है - मुझे लगता है कि आपको एक स्क्रिप्टिंग भाषा (रूबी, पर्ल, PHP, जो भी हो) का उपयोग करने की आवश्यकता होगी, जब तक कि आपके खोल फू पक्का है।