समय द्वारा क्रमबद्ध एक निर्देशिका में 100 पहली फ़ाइलों को सूचीबद्ध करने का सबसे अच्छा तरीका


12

निर्मित टाइमस्टैम्प (सबसे पुराना पहले) द्वारा सॉर्ट की गई निर्देशिका में 100 पहली फ़ाइलों को सूचीबद्ध करने का सबसे अच्छा तरीका क्या होगा। निर्देशिका काफी बड़ी है (लगभग 100000 फाइलें)।

सिर पर लगाए गए ls को पूरा होने में एक भयानक समय लगता है।

संपादित करें:

  • फाइलसिस्टम एक्स 3 है।
  • फ़ोल्डर में फ़ाइलों की संख्या को सीमित करना प्रयास के लायक नहीं है, क्योंकि यह एक दुर्लभ "क्लीन-अप" ऑपरेशन होने जा रहा है और फ़ाइलें एक 3 पार्टी सॉफ्टवेयर द्वारा उत्पन्न होती हैं।
  • निर्माण समय प्रदान करता है और स्वीकार्य समाधान के बजाय फ़ाइल संशोधित समय का उपयोग करना ।


1
यदि यह एक क्लीन-अप ऑपरेशन है, तो शायद आप जो चाहते हैं, वह find -mtime +<number of days> -deleteनिश्चित उम्र से अधिक पुरानी सभी फाइलों को साफ करना है । इसका मतलब है कि कोई भी प्रकार आवश्यक नहीं है।
मिकेल

जवाबों:


14

आप कहते हैं कि " सिर पर पाई जाने वाली एलएस को पूरा होने में एक भयानक लंबा समय लगता है"।

इसका कारण lsआपकी निर्देशिका में फ़ाइलों की संख्या नहीं है । यदि आपके पास एकल निर्देशिका में 100,000 फाइलें हैं, तो इस समस्या को हल करने के किसी भी तरीके से सभी 100,000 फाइलों के बारे में जानकारी प्राप्त करनी होगी, इससे पहले कि वे उन्हें छांटने या किसी आउटपुट को प्रिंट करने के बारे में भी सोच सकें।

यदि यह बहुत लंबा हो रहा है, तो असली समाधान फाइलों को कई निर्देशिकाओं में विभाजित करना है।

यदि आप फ़ाइलों को कई निर्देशिकाओं में नहीं फैला सकते हैं, तो क्या कोई तरीका है जिससे आप विचार करने के लिए फ़ाइलों की संख्या को कम कर सकते हैं ? उदाहरण के लिए यदि फ़ाइल नामों में एक तिथि शामिल है, तो शायद आप वाइल्डकार्ड शामिल कर सकते हैं ताकि सिस्टम को 100,000 फ़ाइलों को क्रमबद्ध न करना पड़े। या शायद वे क्रमिक रूप से गिने जा रहे हैं? (यह मदद कर सकता है या नहीं, लेकिन कोशिश करने लायक है।)

ऐसा करने के लिए आप कितनी बार कोशिश कर रहे हैं? शायद यह फिर से उपयोग के लिए आउटपुट को सहेजने / कैशिंग करने लायक है


अब, एक सवाल।

क्या आप सुनिश्चित हैं कि आपका मतलब "निर्माण समय" है न कि "परिवर्तन का समय" ? अधिकांश उपकरण केवल "परिवर्तन समय" प्रदर्शित कर सकते हैं, "सृजन समय" नहीं।

"निर्माण का समय" प्राप्त करना एक बहुत ही नई बात है, जिसके लिए एक ext4 फाइल सिस्टम की आवश्यकता होती है, और कुछ उपकरण जिन्हें स्थापित करना आसान नहीं है।


अगर आप बदलाव का समय चाहते हैं

चेंज टाइम (शॉर्ट के लिए समय) का मतलब है कि फ़ाइल की विशेषताओं को अंतिम बार बदल दिया गया है।

ls -c समय के अनुसार।

आप आउटपुट को आरोही क्रम में चाहते हैं, अवरोही में नहीं, इसलिए आपको आउटपुट को -rविकल्प के साथ उल्टा करने की आवश्यकता है।

तो आप इसे इस तरह से कर सकते हैं:

ls -cr | head -n 100

एक ही समस्या का एक लंबा समाधान का उपयोग कर stat:

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%Z\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

लेकिन यह ls -crमेरे सिस्टम की तुलना में धीमी गति से चलता है।


यदि आप संशोधन समय चाहते हैं

संशोधन समय (शॉर्ट के लिए माइम) का मतलब है कि फ़ाइल की सामग्री अंतिम बार बदल गई है।

ls -t माइम द्वारा सॉर्ट करें।

बदलें ls -crकरने के लिए ls -tr(सबसे अच्छा विकल्प) या परिवर्तन stat -c $'%Z\t%n'करने के लिए stat -c $'%Y\t%n'


यदि आपको सृजन के समय की आवश्यकता है

(कम समय के लिए)

यह कठिन है।

सबसे पहले, यह सुनिश्चित करें कि निर्देशिका एक फाइलसिस्टम पर है जिसका उपयोग करके स्वरूपित किया गया है ext4। आप इसे tune2fs -l <device name>जांचने के लिए उपयोग कर सकते हैं ।

फिर, एक नया statप्रारूप कहा जाता है %W, जो यहां आपकी मदद कर सकता है। इसे प्राप्त करने के लिए, आपको अक्टूबर 2010 में या उसके बाद रिलीज़ किए गए GNU Coreutils का एक संस्करण डाउनलोड करना होगा, इसे निकालना होगा, इसे संकलित करना होगा और इसे इंस्टॉल करना होगा।

फिर, आपके कर्नेल के आधार पर, यह काम कर सकता है (इसे आज़माया नहीं गया है)।

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%W\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

यह सभी देखें:


यदि आप के बारे में त्रुटियाँ मिलती हैं "'$\t'

'$\t'अंकन की आवश्यकता है bashया zsh: उस में काम नहीं करेगा dashया shUbuntu पर। क्या तुम सच में उन के गोले का उपयोग करने की जरूरत है, आप किसी भी बदलना होगा \tकरने के लिए Ctrl+ V, Tabऔर प्रमुख को हटाने $सिर्फ उद्घाटन बोली से पहले से।


यह संभव है कि वह ext4 नहीं चल रहा हो। मैं अपने सभी मशीनों पर Ubuntu 10.04 चलाता हूं, लेकिन कई ड्राइव पर JFS चलाता हूं। AFAIK JFS निर्माण समय टिकटों का समर्थन करता है।
jernernerny

वास्तव में। हम जानते हैं कि यह ext3 पर समर्थित नहीं है और यह ext4 पर समर्थित है। एक त्वरित खोज से यह पता चलता है कि यह zfs या फ्रीबीएसडी यूएफएस के साथ काम कर सकता है, लेकिन दोनों में से कोई भी उबंटू में आम नहीं है! Jfs या xfs या कुछ और के बारे में निश्चित नहीं है। यदि आप जानकारी / लिंक पा सकते हैं तो और अधिक खुशी होगी।
मिकेल

बहुत व्यापक जवाब देने और सूक्ष्म अनुस्मारक के लिए और अधिक विशिष्ट प्रश्न लिखने के लिए धन्यवाद;) "खोजें" एक विजेता प्रदर्शन-वार निकला, एफएस-प्रकार एक्स 3 हो गया।

2

एक और तरीका अगर आज के कामों का पाया जाता है जो आपके प्रदर्शन के मुद्दों के लिए प्रासंगिक हो सकता है:

I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done

यह सिद्धांत में बहुत तेजी से उत्पादन शुरू करना चाहिए, लेकिन मुझे लगता है कि यह निर्भर करता है कि अंतराल कहां से आ रही है। lsफाइलों को छांटने में अभी लंबा समय लग सकता है ।


मुझे शक है। headवास्तव में बाहर निकलता है जैसे ही उसने पर्याप्त इनपुट पढ़ा है। दोनों timeको सामने की तरफ से चलाने की कोशिश करें । headसंस्करण बहुत तेजी से अपने सिस्टम पर वैसे भी है।
मिकेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.