मैं कैसे बैश में जांच कर सकता हूं कि क्या कोई फ़ाइल x समय से पहले बनाई गई थी?


106

मैं लाइनक्स बैश में जांचना चाहता हूं कि क्या कोई फ़ाइल एक्स समय से पहले बनाई गई थी।

मान लीजिए कि फ़ाइल को text.txt कहा जाता है और समय 2 घंटे है।

 if [ what? ]
 then
     echo "old enough"
 fi

जवाबों:


138

केवल संशोधन समय के लिए

if test `find "text.txt" -mmin +120`
then
    echo old enough
fi

आप -cminपरिवर्तन के लिए या -aminपहुँच समय के लिए उपयोग कर सकते हैं। जैसा कि दूसरों ने बताया कि मुझे नहीं लगता कि आप सृजन समय को ट्रैक कर सकते हैं।


3
आप 'परीक्षण' और backticks छोड़ सकते हैं। यह 'if (test == true)' बनाम 'if (टेस्ट)' के अनुरूप है
बंदूकें

2
तुम सही हो; मुझे लगता है कि मैं सोच रहा था कि findजब कोई मैच नहीं मिले तो गैर-शून्य लौटा।
बंदूकें

4
आप backticks को गिरा सकते हैं और यदि $ टेस्ट करते हैं (text.txt -mmin +120 देखें)
tommy.carstensen

1
@ ब्रोसलो बेहतर दिखते हैं: कोई "एक से अधिक" संभव नहीं है। बेशक, text.txtएक निर्देशिका नहीं माना जाता है।
किमीकपलन

2
: मैं इस वाक्य रचना पसंद करते हैं[ "$(find path/to/file -mmin +120)" ] && echo "it is old"
Alfe

42

मुझे हमेशा date -r /the/file +%sसे इसकी उम्र का पता लगाना पसंद था ।

आप touch --date '2015-10-10 9:55' /tmp/fileएक मनमानी तिथि / समय पर अत्यंत ठीक-ठाक समय प्राप्त करने के लिए भी कर सकते हैं ।


मैं आज उसी चीज की तलाश में था। श्रेष्ठ!
उमैर ए।

धन्यवाद। मैं इस SO प्रश्न पर उतरा क्योंकि मैंने "फ़ाइल बैश की आयु प्रिंट करने का तरीका" जाना। तो यह वही है जो मैं देख रहा था!
नूह ससमान

5
धन्यवाद! एकमात्र चेतावनी के साथ कि ऊपर एक टाइमस्टैम्प (उम्र नहीं) है, लेकिन इसका उपयोग उम्र को शांत करने के लिए किया जा सकता है, जैसे let AGE=$(($(date +%s)-$(date -r /path/to/file +%s))) [इस धारणा के साथ कि इसे बनाया और कभी संशोधित नहीं किया गया, या "मॉड के सापेक्ष आयु"]
nhed

function file-age { FILE_CREATED_TIME=`date -r "$1" +%s`; TIME_NOW=`date +%s`; echo "$[ ${TIME_NOW} - ${FILE_CREATED_TIME} ]"; }
तुरियाग

1
@turiyag अनिवार्य ध्यान दें कि $[ ]है, अगर नहीं पदावनत कम से कम, पुराने और कम पोर्टेबल है, और एक का उपयोग करना चाहिए $(( ))बजाय; और backquotes की तुलना में अधिक नाजुक हैं $( ); और फ़ंक्शन नामों में भी हाइफ़न पूरी तरह से पोर्टेबल नहीं हो सकते हैं। इसका सार अच्छा है, हालांकि!
michaelb958 - GoFundMonica

23

का उपयोग करते हुए stat, बाहर फ़ाइल की अंतिम संशोधन दिनांक लगाने की dateवर्तमान समय और bashisms के ज़्यादा इस्तेमाल यह पता लगाने की, एक परीक्षण है कि आप फ़ाइल के अंतिम संशोधन समय के आधार पर चाहते हैं कर सकते हैं 1

if [ "$(( $(date +"%s") - $(stat -c "%Y" $somefile) ))" -gt "7200" ]; then
   echo "$somefile is older then 2 hours"
fi

जब कोड थोड़ा कम पठनीय होता है, तब findदृष्टिकोण, मुझे लगता है कि इसका बेहतर तरीका है कि findआप पहले से ही "पाए गए" फ़ाइल को देखने के लिए दौड़ रहे हैं । इसके अलावा, तारीख हेरफेर मजेदार है ;-)


  1. फिल के रूप में सही ढंग से नोट किए गए सृजन समय को दर्ज नहीं किया गया है, लेकिन "बदले समय" प्राप्त करने के लिए नीचे के %Zबजाय का उपयोग करें %Yजो आप चाहते हैं।

[अपडेट करें]

मैक उपयोगकर्ताओं के लिए, stat -f "%m" $somefileऊपर लिनक्स विशिष्ट सिंटैक्स के बजाय का उपयोग करें


किस शेल और दिनांक को बनाया गया है? मेरा बैश (GNU, 3.2.48) उनके पास नहीं है।
इयान क्लेलैंड

अरे! माफ़ करना। statबिलिन नहीं है - मुझे बहुत बुरा लगा, मैं ठीक कर दूंगा।
Guss

1
@ सही समाधान काढ़ा के साथ coretutils स्थापित करने के लिए है। :-)
एरिक जोहानसन

1
@ ErikJohansson मैं मौजूदा सॉफ़्टवेयर का उपयोग करते समय अतिरिक्त सॉफ़्टवेयर की स्थापना की आवश्यकता नहीं करता हूं - यह ठीक नहीं है - यह आपको नहीं पता ;-)
Guss

1
जो लोग इसका उपयोग करना चाहते हैं, लेकिन इसे संशोधित करते हैं, यह जानना ठीक होगा कि यह क्या कर रहा है: $ (($ (दिनांक + "% s") - सेकंड 1970-01-01 से 00:00:00 UTC (एपोच) $ (स्टेट -c "% Y" $ somefile)) - एपोक -tt "7200" के बाद से सेकंड के रूप में अंतिम संशोधन का समय - जाँच करता है कि क्या अंतर सेकंड की संख्या x से अधिक है।
देवो

16

निर्माण समय संग्रहीत नहीं है।

क्या संग्रहीत हैं तीन टाइमस्टैम्प्स (आम तौर पर, उन्हें कुछ फाइल सिस्टम पर या कुछ फाइलसिस्टम विकल्पों द्वारा बंद किया जा सकता है):

  • अंतिम पहुंच का समय
  • अंतिम संशोधन समय
  • अंतिम परिवर्तन समय

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


12

हालांकि समय-समय पर तकनीकी रूप से निर्माण का समय नहीं है , यह अक्सर होता है।

चूंकि यह फ़ाइल की सामग्री में परिवर्तन से प्रभावित नहीं है, इसलिए यह आमतौर पर केवल तब ही अपडेट किया जाता है जब फ़ाइल बनाई जाती है। और हां - मैं आपको चिल्लाते हुए सुन सकता हूं - यह भी अद्यतन किया जाता है यदि आप एक्सेस अनुमतियों या स्वामित्व को बदलते हैं ... लेकिन आम तौर पर ऐसा कुछ होता है जो एक बार होता है, आमतौर पर उसी समय आप फ़ाइल को वहां डालते हैं।

व्यक्तिगत रूप से मैं हमेशा सब कुछ के लिए माइम का उपयोग करता हूं, और मैं कल्पना करता हूं कि आप क्या चाहते हैं। लेकिन वैसे भी ... यहाँ एक आसान उपयोग करने के लिए, Guss के "बदसूरत" बैश का पूर्वाभ्यास है।

#! / Bin / bash
कार्य आयु () {
   स्थानीय फ़ाइल नाम = $ 1
   स्थानीय परिवर्तित = `स्टेट -c% Y" $ फ़ाइलनाम "
   स्थानीय अब = `तिथि +% s`
   स्थानीय बीत गया

   बीता हुआ = अब बदला हुआ
   $ गूंज गूंज
}

फ़ाइल = "/"
गूंज $ फ़ाइल की आयु $ है (आयु "$ फ़ाइल") सेकंड।

यह उपयोगी था, लेकिन यह OSX के लिए सही काम नहीं करता था, क्योंकि इस पर स्टेट को अलग तरह से लागू किया जाता है। एकमात्र क्रॉस-सिस्टम संगत तरीका मैंने पाया कि पर्ल का उपयोग करना था। यदि आप इसी लाइन को इसके साथ प्रतिस्थापित करते हैं, तो स्क्रिप्ट को Macs पर काम करना चाहिए: local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime") superuser.com/questions/427551/…
Bijou Trouvaille

1
"क्रिएशन टाइम" एक अवधारणा है जिसे समझना मुश्किल है। प्रतिलिपि फ़ाइल के लिए इसका क्या अर्थ है? एक स्थानांतरित फ़ाइल के लिए क्या? क्या होगा यदि इसे एक डिवाइस बॉर्डर के पार ले जाया जाए (इसलिए इसे नए सिरे से बनाया गया है, एक अर्थ में)? एक पैकेज्ड और बाद में अनपैकड फाइल के लिए इसका क्या मतलब है? यहां कई उत्तर संभव हैं और कोई आम सहमति नहीं है। हालांकि, समय का उल्लेख करना अच्छा है, लेकिन मैं इसे "सृजन समय" की अस्पष्ट अवधारणा के निकट नहीं लाऊंगा। विशेष रूप से चूंकि chmodफ़ाइल पर लागू एक सरल , उस विचार को शून्य कर देगा। लेकिन मैं आपके साथ ऐसा कर सकता हूं ;-)
अल्फ़

@ शेल्फ: आप +%sदूसरी छमाही से गायब हैं
ग्रिज़्ली

वह उम्र कम हो सकती है: age() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); } (सुधार के लिए @Grizly के लिए धन्यवाद!)
अल्फ

वास्तव में एक्सेस टाइम का उपयोग करना बेहतर है जो noatimeऑप्शन के साथ माउंट किए गए सभी फाइल सिस्टम पर एक निर्माण समय है (जो प्रदर्शन के लिए अच्छा है इसलिए आपको इसका उपयोग करना चाहिए)। तो %Xइसके बजाय बस का उपयोग करें %Y
नक्स

7

खोज एक अच्छी है, लेकिन मुझे लगता है कि आप किसी अन्य मार्ग का उपयोग कर सकते हैं, खासकर अगर आपको अब कितने सेकंड पुराने फ़ाइल की आवश्यकता है

date -d "now - $( stat -c "%Y" $filename ) seconds" +%s

GNU दिनांक का उपयोग करना


Gstat का उपयोग करें, "काढ़ा स्थापित कोरुटिल्स"
एरिक जोहानसन

3

उपकरण 'स्टेट' के परिणाम पर विचार करें:

  File: `infolog.txt'
  Size: 694         Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 11635578    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     fdr)   Gid: ( 1000/     fdr)
Access: 2009-01-01 22:04:15.000000000 -0800
Modify: 2009-01-01 22:05:05.000000000 -0800
Change: 2009-01-01 22:05:05.000000000 -0800

आप यहां एक्सेस / संशोधित / परिवर्तन की तीन तिथियां देख सकते हैं। कोई बनाई गई तारीख नहीं है। आप वास्तव में केवल तभी सुनिश्चित हो सकते हैं जब फ़ाइल सामग्री को संशोधित किया गया था ("संशोधित" फ़ील्ड) या इसका इनकोड बदल गया ("परिवर्तन" फ़ील्ड)।

दोनों क्षेत्रों के अद्यतन होने के उदाहरण:

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

यदि किसी ने chmod के माध्यम से अनुमतियां बदलीं तो "बदलें" अपडेट हो जाएगा।


प्रदत्त, स्टेट आपको प्रासंगिक जानकारी बता सकता है। लेकिन जो हम चाहते हैं उसे पाने के लिए पार्स करना काफी थकाऊ होगा।
PypeBros

0

मैं उपयोग करता हूं

file_age() {
    local filename=$1
    echo $(( $(date +%s) - $(date -r $filename +%s) ))
}

is_stale() {
    local filename=$1
    local max_minutes=20
    [ $(file_age $filename) -gt $(( $max_minutes*60 )) ]
}

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