कैसे सत्यापित करें कि फ़ाइल 2 बैश में फ़ाइल 1 की तुलना में नया है?


51

मैं कैसे सत्यापित कर सकता हूं कि file2पिछली बार के बाद संशोधित किया गया था file1?

इस उदाहरण में, perlहाल ही में की तुलना में अधिक संशोधित किया गया था stack। क्या कोई बैश या लिनक्स कमांड है जो संशोधन समय के आधार पर इन फाइलों की तुलना कर सकता है ?

-rw-r--r--    1 root     root         1577 Sep  7 22:55 stack
-rwxr-xr-x    1 root     root          626 Sep  7 23:10 perl

जवाबों:


51

यहां मिला

for f in /abcd/xyz* do
   [ "$f" -nt /abcd/test.txt ] && echo "file f$ found" done

14
इसके अलावा -ot"पुराने से" है।
डेनिस विलियमसन

1
मुझे लगता है कि मैं सिर्फ इस के साथ एक समस्या में चला गया हूँ। सेकंड के नीचे एक ही संशोधन समय के साथ फ़ाइलों के लिए, वे इन परीक्षणों द्वारा "समान" उम्र हैं; दोनों-और -ot समान परिणाम (असत्य) देते हैं। मेरे उपयोग के मामले में मुझे दूसरों को आउटपुट पढ़ने का एक प्रोग्राम मिला है, और मुझे यह सुनिश्चित करने की ज़रूरत है कि वे सही क्रम में चले। इस मामले में नैनोसेकंड की तुलना करना आवश्यक प्रतीत होता है।
sjmc


7

ऐसा करने का एक और तरीका:

find -name file2 -newer file1

अगर फ़ाइल 2 अधिक पुरानी है या फ़ाइल 1 जैसी उम्र है यदि यह नया है तो यह फ़ाइल 2 का नाम (और निर्देशिका) लौटाएगा।

ज्ञात हो कि जब फाइल बनाई गई थी तब लिनक्स उसका ट्रैक नहीं रखता था। ये परीक्षण सबसे हालिया संशोधन तिथि और समय के लिए होंगे।


2
लिनक्स निर्माण समय का ध्यान रखता है: इसे समय कहा जाता है। यह अंतिम पहुंच के समय का भी ध्यान रखता है: atime। यह आमतौर पर माइम का उपयोग करता है क्योंकि यह अंतिम संशोधन समय है, जो सबसे उपयोगी है।
कोर्स

2
@ कोरोस: ctimeनिर्माण समय नहीं है। यह इनकोड परिवर्तन का समय होता है और फ़ाइल की विशेषताओं जैसे कि स्वामी या अनुमति या जब आप फ़ाइल को संशोधित करते हैं, तो अपडेट हो जाता है। कुछ फ़ाइल सिस्टम जन्म के समय का समर्थन करते हैं, लेकिन कर्नेल नहीं करता है। स्टेट एक खाली जन्म समय दिखाता है। देखें unix.stackexchange.com/a/91200 ध्यान दें कि OS X जन्म के समय का समर्थन करता हैstat -f %SB filename
डेनिस विलियम्सन

इसके अलावा htrp देखें: //unix.stackexchange.com/a/50184 debugfsलिनक्स में निर्माण (जन्म) समय देखने के लिए कैसे उपयोग करें।
डेनिस विलियमसन

2

यदि आप अधिक विस्तृत जानकारी चाहते हैं तो आप statकमांड का उपयोग कर सकते हैं

<tbielawa>@(fridge)[~/SuperUser] 03:15:10
$ touch firstFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:24
$ touch secondFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:45
$ stat firstFile 
  File: `firstFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151528      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:24.938721003 -0400
Modify: 2010-09-14 03:15:24.938721003 -0400
Change: 2010-09-14 03:15:24.938721003 -0400
<tbielawa>@(fridge)[~/SuperUser] 03:15:48
$ stat secondFile 
  File: `secondFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151529      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:45.074722792 -0400
Modify: 2010-09-14 03:15:45.074722792 -0400
Change: 2010-09-14 03:15:45.074722792 -0400

2
echo $(($(date -r file1 +%s)-$(date -r file2 +%s)))
2208

यदि परिणाम> 0 है, तो पहली फ़ाइल नई है। (अंतिम संशोधन के संदर्भ में नया-, सृजन-समय नहीं, जो लिनक्स पर संग्रहीत है)।


-आम तौर पर बेहतर है, लेकिन यह अभी भी एक उपयोगी पोस्ट है ...
BuvinJ

0

इस लिंक के अनुसार, यूनिक्स निर्माण की तारीख को संग्रहीत नहीं करता है। http://www.issociate.de/board/post/302628/How_to_check_file_creation_date.html

लेकिन अंतिम पहुँच को संग्रहीत करता है।

अंतिम पहुँच के लिए

 ls -t  # displays in order of date. So the first one is the 

ls प्रत्येक फ़ाइल को एक नई लाइन पर प्रदर्शित करता है।

इसलिए ls -t पहली लाइन आदि पर नवीनतम फ़ाइल प्रदर्शित करता है।

  • पहली पंक्ति चुनने के लिए आप स्वयं का उपयोग कर सकते हैं।
  • पहली पंक्ति चुनने के लिए आप sed का उपयोग कर सकते हैं।

    ls -t php.exe php.ini | sed -n '1p' php.ini

कर सकता है -lt , हालांकि आप देखेंगे कि अगर आप किसी भी फाइल को निर्दिष्ट नहीं करते हैं .. और यह निर्देशिका .. तो यह पहली पंक्ति पर कुल, देता है ताकि आप की तरह दूसरी लाइन लेने$ls -lt | sed -n '2p'

एक अच्छा होगा

ls -t | head -n 1

या

ls -lt | head   

पहले संशोधित की गई पहली फ़ाइल में पहले 10 लाइनों को प्रदर्शित करता है और आप देख सकते हैं कि यह कौन सी है


-tसंशोधन समय है; -uपहुंच का समय है
डेनिस विलियमसन

धन्यवाद .. मैं सोच रहा था के बारे में -u .. भेद .. और हाँ जैसा कि आप सुझाव देते हैं .. -t और -u समय से आदेश दिया .. जैसा कि मनुष्य ने किया है। यह तारीख से आदेश कहने से बेहतर है।
बार्लोप

हालांकि दिनांक / समय के अनुसार आदेश के रूप में शायद उतना अच्छा नहीं; ;-)
बार्लोप

0

यहाँ थोड़ी स्क्रिप्ट है, मैंने किया:

mtf0=`stat -c %Y file0`    
mtf1=`stat -c %Y file1`    
dt=$(( mtf1 - mtf0 ))    
[[ $dt -gt 0 ]] && echo "File F1 is newer than file F0 "

आपको इस बारे में अधिक विस्तार से बताना चाहिए कि यह कमांड के लिए कुछ संदर्भों के साथ क्या कर रहा है ताकि लोग इसका उपयोग करने के लिए संभावित रूप से इसके बारे में पढ़ने का मौका दें या अपने ब्रेक को सुनने के लिए इसे केवल कमांड और सिंटैक्स साबित करने की तुलना में थोड़ा अधिक सुनें।
पिंपल जूस आईटी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.