पिछली बार फाइल खोली थी


94

क्या यह संभव है कि जब पिछली बार फ़ाइल खोली गई थी और उस समय तक सभी फ़ाइलों को एक निर्देशिका में सॉर्ट करें?

जवाबों:


172

यह बिल्कुल उसी पर निर्भर करता है, जिसका अर्थ है "खोला", लेकिन सामान्य तौर पर, हाँ। सामान्य रूप से दर्ज तीन टाइमस्टैम्प हैं:

  • mtime- फ़ाइल सामग्री बदलने पर अद्यतन। यह ज्यादातर मामलों में "डिफ़ॉल्ट" फ़ाइल समय है।
  • ctime- फ़ाइल या उसके मेटाडेटा (स्वामी, अनुमतियाँ) को बदलने पर अद्यतन
  • atime - फ़ाइल पढ़ी जाने पर अपडेट की गई

तो, आम तौर पर, आप जो देखना चाहते हैं, वह atimeफ़ाइल का है। आप के साथ statया साथ मिल सकता है ls। आप ऐसा करने के ls -luलिए उपयोग कर सकते हैं , हालांकि मैं उपयोग करना पसंद करता हूं ls -l --time=atime(जिसे लगभग सभी आधुनिक लिनक्स वितरणों में समर्थित होना चाहिए) क्योंकि मैं अक्सर इसका उपयोग नहीं करता हूं, और जब मैं करता हूं तो मैं इसे बेहतर तरीके से याद रख सकता हूं। और समय के अनुसार छाँटने के लिए -tध्वज को ls में जोड़ें । तो यह तूम गए वहाँ।

हालांकि एक बड़ा चेतावनी है। हर बार जब फ़ाइल को पढ़ा जाता है, तब अपडेट करना आमतौर पर अनावश्यक-अनावश्यक IO का कारण बनता है, जिससे सब कुछ धीमा हो जाता है। इसलिए, अधिकांश लिनक्स वितरण अब noatimeफाइलसिस्टम माउंट विकल्प के लिए डिफ़ॉल्ट हैं , जो मूल रूप से अपराधों को मारता है, या फिर relatime, जो केवल एक बार सीमा पार होने पर सामान्य रूप से अपडेट होता है (सामान्य रूप से प्रति दिन एक बार) या यदि फ़ाइल वास्तव में पिछले रीड के बाद संशोधित हुई थी। mountकमांड चलाकर आप यह पता लगा सकते हैं कि ये विकल्प सक्रिय हैं या नहीं ।

इसके अलावा, ध्यान दें कि एक्सेस का समय इनकोड द्वारा होता है, फ़ाइल नाम से नहीं, इसलिए यदि आपके पास हार्डलिंक है, तो एक से पढ़ना सभी नामों को अपडेट करेगा जो एक ही फ़ाइल को संदर्भित करते हैं।

और, ध्यान रखें कि "सृजन" नहीं है; निर्माण यूनिक्स / लिनक्स फाइल सिस्टम द्वारा ट्रैक नहीं किया गया है, जो अजीब लगता है लेकिन वास्तव में समझ में आता है क्योंकि फाइलसिस्टम को यह जानने का कोई तरीका नहीं है कि क्या यह मूल है - शायद फाइल चालीस साल पहले बनाई गई थी और यहां कॉपी की गई थी। और, वास्तव में, कई फ़ाइल संपादक मूल पर प्रतियां बनाकर काम करते हैं। यदि आपको उस जानकारी की आवश्यकता है, तो जैसे संस्करण नियंत्रण प्रणाली का उपयोग करना सबसे अच्छा है git


9
मैं आपको +1 से अधिक देता, यदि मैं "सृजन समय" के लिए समय पर कॉल न कर पाता।
jsbillings

2
माउंट मैनपेज के अनुसार, रिलेटाइम का दैनिक सीमाओं से कोई लेना-देना नहीं है, लेकिन केवल माइम और केम के सापेक्ष ही समय दिखता है । यदि atime, mtime या ctime से पुराना है, तो atime अपडेट किया जाता है। यदि दोनों की तुलना में परमाणु नया है, तो यह अकेला बचा है। इसका उद्देश्य atime और mtime / ctime के बीच संबंध को संरक्षित करना है , क्योंकि कुछ एप्लिकेशन उस जानकारी का उपयोग करते हैं, जैसे कि यह देखने के लिए कि क्या यह आपके मेलबॉक्स को पढ़ चुका है, क्योंकि यह अंतिम अपडेट था।
jw013

1
@ jw013 यह 2.6.30 कर्नेल के बाद से मामला है। यह सच है कि कुछ पुराने वितरणों में यह व्यवहार नहीं हो सकता है। (लेकिन फेडोरा जैसे वितरणों के लिए, यह तब भी सच था जब मैंने तीन साल पहले इस उत्तर का मूल संस्करण लिखा था।) एक अद्यतन mountमैनपेज देखें।
mattdm

1
lsडिफ़ॉल्ट रूप से समझदार परिशुद्धता के लिए समय कम कर देता है। पूर्ण परिशुद्धता में समय देखने के लिए कोई भी उपयोग कर सकता है --full-time
jlh

19

ls -ltu सभी फाइलों को सूचीबद्ध करें, पहुंच समय के अनुसार दिखाते और छांटें।

से man ls:

-u     with -lt: sort by, and show, access time with -l: show access
       time and sort by name otherwise: sort by access time

4

इसके लिए findकमांड बेस्ट है। देखें -ctime, -mtime, और -atimeविकल्प


3

यदि आपकी सूची मानव उपभोग के लिए है, तो केवल एक बार (संशोधन के लिए ) पहुँच (पढ़ने के लिए) के लिए lsछँटाई करने वाली तारीखों में से एक का उपयोग करें । अधिक जानकारी (विशेष रूप से संबंधित चेतावनी और परिभाषा के लिए ) के लिए mattdm का उत्तर देखें ।-tu-t-tc-a-c

यदि यह प्रोग्राम खपत के लिए है, तो आउटपुट का पार्सिंग lsसमस्याग्रस्त है । यदि आपका शेल zsh है, तो आपको किसी lsभी तरह की आवश्यकता नहीं है: zsh के पास एक्सेस ( *(Oa)), इनोड परिवर्तन ( *(Oc)) या संशोधन ( *(Om)) समय बढ़ाकर मैच को सॉर्ट करने के लिए ग्लोबिंग क्वालिफायर है । oबढ़ती उम्र के हिसाब से लोअरकेस सॉर्ट।

act_on_files_by_date *(Om)

अन्यथा, यदि आप जानते हैं कि फ़ाइल नामों में कोई नई रेखा या गैर-मुद्रण योग्य वर्ण (वर्तमान स्थान में) नहीं है, तो आप कुछ ऐसा कर सकते हैं

ls -t | while read -r name; do act_on_one_file "$name"; done
ls -t | xargs -I {} act_on_one_file {}

यदि आप एक साथ कई फाइलों पर कमांड लागू करना चाहते हैं, तो आपको अधिक सेटअप की आवश्यकता है। ध्यान दें कि act_on_files_by_date $(ls -t)इस तरह से काम नहीं करता है, क्योंकि वाइल्डकार्ड वर्णों या व्हाट्सएप वाले फ़ाइलनामों को कमांड प्रतिस्थापन के परिणाम में विस्तारित किया जाएगा। निम्नलिखित कोड तब तक काम करता है जब तक किसी फ़ाइल नाम में एक नई रेखा या एक गैर-मुद्रण योग्य वर्ण नहीं होता है:

IFS='
'
set -f
act_on_files_by_date $(ls -t)
set +f
unset IFS

यदि आप मनमाने फ़ाइल नामों के साथ सामना करना चाहते हैं, तो आपके पास एक मानक शेल की तुलना में अधिक शक्तिशाली उपकरणों का सहारा लिए बिना बहुत कठिन समय होगा: zsh, perl, python…

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.