निर्धारित करें कि क्या कोई फ़ाइल संशोधित की गई है


10

लिनक्स में (वर्तमान में ext4 फाइलसिस्टम का उपयोग करते हुए), यदि कोई फाइल को बिना उसकी किसी सामग्री को पढ़े संशोधित किया गया है, तो कोई कैसे जल्दी से जांच कर सकता है ?

क्या statकमांड एक अनुशंसित दृष्टिकोण है? मैं वर्तमान में करता हूं

$ stat --format "%Y" hello.txt

और बाद में मैं देख सकता हूं कि क्या एक ही कमांड एक ही आउटपुट देता है। यदि ऐसा होता है, तो मैं निष्कर्ष निकालता हूं कि हेलो.टैक्स नहीं बदला है।

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

इस विषय पर, मुझे याद है कि एक ट्रू-क्रिप्ट वॉल्यूम जिसे मैंने एक बार हमेशा अपने वृद्धिशील बैकअप प्रोग्राम द्वारा अनदेखा किया था, संभवतः क्योंकि ट्रू-क्रिप्टेक ने कोई मेटा डेटा परिवर्तन पीछे नहीं छोड़ना सुनिश्चित किया था। मुझे लगता है कि यह वास्तव में सभी डेटा को बदलने के लिए संभव है stat, इसलिए इसे फ़ाइल के हर संभव संशोधन पर लेने की गारंटी नहीं दी जा सकती है?


md5sum filename?
रमेश

md5sumया किसी भी प्रकार की चेकसम फाइल की सामग्री को पढ़ता है। मैं ऐसा नहीं करना चाहता हूं क्योंकि यह मेरे उद्देश्यों के लिए बहुत धीमा है।
डस्टबाइट

ls -tकिसी निर्देशिका में संशोधन समय द्वारा सामग्री को सॉर्ट करेगा।
रेकायो

"संशोधित किया गया है"? हर फाइल को संशोधित किया गया है, सवाल यह है कि इसे कब संशोधित किया गया था। आप एक विशिष्ट श्रेणी के संशोधन समय की खोज के लिए 'खोज' का उपयोग कर सकते हैं।
रे एंड्रयूज

जवाबों:


5

यदि आप यह पता लगाना चाहते हैं कि क्या फ़ाइल को सामान्य साधनों के माध्यम से संशोधित किया गया है (इसे कुछ एप्लिकेशन में संपादित करना, एक संशोधन नियंत्रण प्रणाली से एक नया संस्करण की जांच करना, इसका पुनर्निर्माण करना, आदि), तो जांचें कि क्या इसका संशोधन समय (माइम) से बदल गया है अंतिम जाँच। यही stat -c %Yरिपोर्ट है।

संशोधन समय touchकमांड द्वारा निर्धारित किया जा सकता है । यदि आप यह पता लगाना चाहते हैं कि क्या फ़ाइल किसी भी तरह से बदल गई है ( touchएक संग्रह, आदि को निकालने के उपयोग सहित ), तो जांचें कि क्या इसका इनकोड परिवर्तन समय (समय ) पिछले चेक से बदल गया है। यही stat -c %Zरिपोर्ट है। सिस्टम प्रशासक (और फिर भी, केवल अप्रत्यक्ष साधनों के माध्यम से: सिस्टम घड़ी को बदलकर, या सीधे डिस्क को एक्सेस करके, फाइल सिस्टम को दरकिनार करके) समय को खराब नहीं किया जा सकता है।


धन्यवाद, मैं उस समय को इकट्ठा करता हूं जो मुझे उपयोग करना चाहिए। मेरे सवाल से यह नहीं पता चला कि इसका उद्देश्य मेरी अपनी बैकअप स्क्रिप्ट में इसका उपयोग करना है, जहां चेकसमों की गणना केवल नई फ़ाइलों या फ़ाइलों के लिए की जाएगी जो बदल गई हैं। मैं उन फाइलों के लिए कंप्यूटिंग चेकसमों को बदल सकता हूं जो केवल "थोड़ा" बदल गए हैं, कहते हैं कि अनुमतियां बदल गई हैं, आदि। मैं वास्तव में बदलाव के लिए फ़ाइल की सामग्री को देखने के लिए जितना संभव हो उतना करीब होना पसंद करता हूं।
डस्टबाइट

3

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

इसके अलावा, अन्य कार्यक्रमों के लिए एक मनमाना संशोधन समय निर्धारित करना संभव है। आप देख सकते हैं कि टच कमांड के माध्यम से यह कैसे हो सकता है।

यदि आप उन दो संभावनाओं के बारे में चिंतित हैं, तो यह फ़ाइल आकार को देखने के लिए एक बुरा विचार नहीं होगा। यह तब होता है जब rsync संशोधित फ़ाइलों की तलाश करता है।


1

मेरी भावना यह है कि कोई और अधिक सुनिश्चित करने के लिए अधिक मापदंडों में फेंकना चाहता है।

आपके पास सही तरीका है। असफल होने का एकमात्र कारण यह होगा कि अगर फाइलसिस्टम ठीक से अपडेट नहीं हो रहा है - तो उस स्थिति में आप अधिक गंभीर समस्याओं के पूरे समूह के साथ समाप्त हो जाएंगे।

बेशक, मैं सही ज्ञान और एक प्रणाली है जहाँ विभाजन सुलभ इसे बनाने के लिए जानकारी को बदलने के लिए सक्षम हो सकता है है के लिए रूट का उपयोग के साथ किसी को अनुमान देखने के रूप में यदि फ़ाइल नहीं बदला गया है। हालांकि, इस मामले में उन्होंने निश्चित रूप से आकार के साथ ऐसा करना सुनिश्चित किया है, आदि।


0

मैं फिंगरप्रिंट को अधिक विस्तृत बनाता हूं।

मैंने थोड़ा रैपर फंक्शन किया जो मैकओएस / बीएसडी और जीएनयू दोनों संस्करणों के लिए समान आउटपुट उत्पन्न करता है stat(साथ ही एक gप्रीफिक्स के साथ होमब्रे-इंस्टॉल किए गए संस्करण का भी पता लगाता है )।

init() {
  if command -v gstat > /dev/null; then
    # GNU coreutils with g prefix.
    statCmdArgs=("gstat" "--format=%n %s %b %u %g %i %h %Y %Z %W %o");
  elif ! stat --version > /dev/null 2> /dev/null; then
    # MacOS/BSD stat
    statCmdArgs=("stat" "-f" "%N %z %b %u %g %i %l %m %c %B %k");
  else
    # Assume GNU version without prefix.
    statCmdArgs=("stat" "--format=%n %s %b %u %g %i %h %Y %Z %W %o");
  fi;
}

getFileStatus() {
  "${statCmdArgs[@]}" "$1";
}

initसमारोह एक बार स्क्रिप्ट आरंभीकरण के दौरान कहा जाता हो जाता है और getFileStatusपता लगाने के ऊपरी व्यय के बिना बार-बार कहा जा सकता है।

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