এক্স টাইমের আগে কোনও ফাইল তৈরি করা হয়েছিল কিনা তা আমি কীভাবে বাশনে চেক করব?


106

আমি লিনাক্স ব্যাশে চেক করতে চাই যে এক্স টাইমের আগে কোনও ফাইল তৈরি হয়েছিল কিনা।

ধরা যাক ফাইলটিকে পাঠ্য.টেক্সট বলা হয় এবং সময়টি ২ ঘন্টা।

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

উত্তর:


138

শুধুমাত্র পরিবর্তনের সময় জন্য

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

আপনি -cminপরিবর্তন বা -aminঅ্যাক্সেস সময়ের জন্য ব্যবহার করতে পারেন । অন্যরা নির্দেশিত হিসাবে আমি মনে করি না আপনি তৈরির সময় ট্র্যাক করতে পারবেন।


3
আপনি 'পরীক্ষা' এবং ব্যাকটিকগুলি ড্রপ করতে পারেন। এটি 'যদি (পরীক্ষা == সত্য)' বনাম 'যদি (পরীক্ষা)'
বন্দুকগুলি

2
আপনি সঠিক; আমি মনে করি আমি ভাবছিলাম যে findকোনও ম্যাচ না পাওয়া গেলে শূন্য-অন ফিরে এসেছে।
বন্দুক

4
আপনি ব্যাকটিকগুলি ড্রপ করে পরীক্ষা করতে পারেন তবে text (টেক্সট.টেক্সট -মিন +120 সন্ধান করুন)
tommy.carstensen

1
@ ব্রোস্লো আরও ভাল দেখাচ্ছে: এখানে "একের বেশি" কোনও সম্ভাবনা নেই। অবশ্যই, text.txtএকটি ডিরেক্টরি না হিসাবে অনুমান করা হয়।
কিমিপ্যাপ্লান

2
আমি এই বাক্য [ "$(find path/to/file -mmin +120)" ] && echo "it is old"
গঠনটি

42

আমি সর্বদা date -r /the/file +%sএর বয়স খুঁজে পেতে ব্যবহার পছন্দ করি ।

আপনি touch --date '2015-10-10 9:55' /tmp/fileএকটি স্বেচ্ছাসেবী তারিখ / সময় অত্যন্ত সূক্ষ্ম সময় পেতে করতে পারেন ।


আমি আজ একই জিনিস খুঁজছিলাম। শ্রেষ্ঠ!
উমায়ের এ।

ধন্যবাদ। আমি এই এসও প্রশ্নটিতে অবতরণ করেছি কারণ আমি "ফাইল ব্যাশের বয়স কীভাবে প্রিন্ট করব" oo আমি ঠিক তাই খুঁজছিলাম!
নোহ সুসমান

5
ধন্যবাদ! শুধুমাত্র সতর্কীকরণ যে উপরে একটি টাইমস্ট্যাম্প (না বয়স) হল কিন্তু তাই মত বয়স Calc ব্যবহার করা যেতে পারে সঙ্গে 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} ]"; }
turyag

1
@turiyag বাধ্যতামূলক দয়া করে মনে রাখবেন $[ ], যদি না অবচিত অন্তত পুরানো এবং কম পোর্টেবল , এবং ব্যবহার করা উচিত $(( ))পরিবর্তে; এবং ব্যাককোটগুলি এর চেয়ে ভঙ্গুর $( ); এবং ফাংশন নামের হাইফেনগুলি সম্পূর্ণ পোর্টেবল নাও হতে পারে। এর সারমর্মটি ভালো, যদিও!
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উপরের লিনাক্সের নির্দিষ্ট সিনট্যাক্সের পরিবর্তে ব্যবহার করুন


কোন শেলটি তারিখ এবং স্ট্যাটাসটি অন্তর্নির্মিত হয়? আমার বাশ (জিএনইউ, 3.2.48) এগুলি নেই।
ইয়ান ক্লেল্যান্ড 19

ওহো দুঃখিত. statঅন্তর্নির্মিত নয় - আমার খুব খারাপ, আমি ঠিক করব।
গাস

1
@ গুগের সঠিক সমাধানটি হল ব্রু সহ কোর্টটিলগুলি ইনস্টল করা। :-)
এরিক জোহানসন

1
@ এরিক জোনসন আমি বিদ্যমান সফটওয়্যারটি ভালভাবে কাজ করার সময় অতিরিক্ত সফ্টওয়্যার ইনস্টল করার প্রয়োজন নেই - এটি উইন্ডোজ নয়, আপনি জানেন ;-)
গাস

1
যে লোকেরা এটি ব্যবহার করতে চান তবে এটি পরিবর্তন করতে চান, এটি ঠিক কী করছে তা জানা ভাল হবে: -0 (($ (তারিখ + "% s")) - 1970-01-01 00:00:00 ইউটিসি থেকে সেকেন্ড (Epoch) stat (stat -c "% Y" $ somefile))) - Epoch -gt "7200" সাল থেকে সেকেন্ড হিসাবে শেষ পরিবর্তনের সময় - পার্থক্য x সেকেন্ডের চেয়ে বেশি হয় কিনা তা পরীক্ষা করে।
ডিভো

16

সৃষ্টির সময় সঞ্চিত নয়।

যা সংরক্ষণ করা হয় তা তিনটি টাইমস্ট্যাম্প (সাধারণত, সেগুলি নির্দিষ্ট ফাইল সিস্টেমগুলিতে বা নির্দিষ্ট ফাইল-সিস্টেম অপশন দ্বারা বন্ধ করা যেতে পারে):

  • শেষ অ্যাক্সেস সময়
  • শেষ পরিবর্তন সময়
  • শেষ পরিবর্তন সময়

ফাইলটিতে একটি "পরিবর্তন" অনুমতি পরিবর্তন, পুনর্নবীকরণ ইত্যাদি হিসাবে গণ্য করা হয়, যদিও পরিবর্তনটি কেবলমাত্র বিষয়বস্তু।


12

যদিও সিটিটাইম প্রযুক্তিগতভাবে সৃষ্টির সময় নয় , এটি প্রায়শই হয়।

যেহেতু সিটিটাইম এটি ফাইলের বিষয়বস্তুগুলির পরিবর্তনের দ্বারা প্রভাবিত হয় না, সাধারণত ফাইলটি তৈরি করা হয় তখন এটি আপডেট হয়। এবং হ্যাঁ - আমি আপনাকে সমস্ত চিৎকার শুনতে পাচ্ছি - আপনি অ্যাক্সেসের অনুমতি বা মালিকানা পরিবর্তন করলে এটিও আপডেট হয় ... তবে সাধারণত এটি এমন কিছু হয় যা সাধারণত একবারে আপনি সেখানে ফাইলটি রেখে দেন once

ব্যক্তিগতভাবে আমি সর্বদা সব কিছুর জন্য এমটাইম ব্যবহার করি এবং আমি কল্পনা করি এটি আপনি চান। তবে যাইহোক ... এখানে গাসের "আনট্রেসিটিভ" বাশটির পুনরায় সামঞ্জস্য করা হয়েছে, সহজে ব্যবহারের ফাংশনে।

#! / বিন / ব্যাশ
ফাংশন বয়স () {
   স্থানীয় ফাইলের নাম = $ 1
   স্থানীয় পরিবর্তিত = `স্ট্যাটিক -c% Y" $ ফাইলের নাম "` `
   স্থানীয় এখন = `তারিখ +% s``
   স্থানীয় বিলম্বিত

   কেটে গেছে = এখন-পরিবর্তিত
   প্রতিধ্বনিত হয়েছে $
}

ফাইল = "/"
প্রতিধ্বনি $ ফাইলের বয়স $ (বয়স "$ ফাইল") সেকেন্ড।

এটি দরকারী ছিল, তবে এটি ওএসএক্সের জন্য এখনই কাজ করে না কারণ স্ট্যাটাসটি এতে আলাদাভাবে প্রয়োগ করা হয়। পার্ল ব্যবহার করা আমার একমাত্র ক্রস-সিস্টেমের সামঞ্জস্যপূর্ণ উপায়। স্ক্রিপ্ট Macs- এর কাজ করা উচিত যদি আপনার সাথে এই সংশ্লিষ্ট লাইন প্রতিস্থাপন করুন: local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime") superuser.com/questions/427551/...
মণি Trouvaille

1
"সৃষ্টির সময়" উপলব্ধি করা শক্ত। অনুলিপি করা ফাইলটির অর্থ কী? একটি সরানো ফাইলের জন্য কী? যদি এটি কোনও ডিভাইস সীমান্তের ওপারে সরানো হয় (তবে এটি নতুনভাবে তৈরি করা হয়েছে, এক অর্থে)? প্যাকেজযুক্ত এবং পরে প্যাকেজবিহীন ফাইলটির অর্থ কী? বেশ কয়েকটি উত্তর এখানে সম্ভব এবং কোনও sensক্যমত্য বিদ্যমান নেই। সিটিটাইমের কথা উল্লেখ করা ভাল, তবে আমি এটি "সৃষ্টির সময়" এর অস্পষ্ট ধারণার কাছে শব্দার্থিকভাবে রাখি না। বিশেষত যেহেতু একটি সাধারণ chmod, ফাইলটিতে প্রয়োগ করা হয়েছে, সেই ধারণাটি বাতিল করে দেবে। কিন্তু আমি সঙ্গে বসবাস করতে পারেন আপনি যে কি করছেন ;-)
Alfe

@ আলফা: আপনি +%sদ্বিতীয়ার্ধ থেকে মিস করছেন
গ্রিজলি

যে বয়স পথ খাটো হতে পারে: age() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); } (সংশোধনের জন্য @Grizly ধন্যবাদ!)
Alfe

আসলে অ্যাক্সেসের সময়টি ব্যবহার করা noatimeভাল যা বিকল্প ফাইলের সাথে মাউন্ট করা সমস্ত ফাইল সিস্টেমে তৈরির সময় (যা পারফরম্যান্সের জন্য ভাল তাই এটি ব্যবহার করা উচিত)। সুতরাং কেবল %Xপরিবর্তে ব্যবহার করুন %Y
Nux

7

এটির সন্ধানটি ভাল তবে আমি মনে করি আপনি অন্যভাবেই ব্যবহার করতে পারবেন, বিশেষত আপনার এখন ফাইল সেকেন্ডটি কত সেকেন্ডের দরকার

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

জিএনইউ তারিখ ব্যবহার করে


জিস্ট্যাট ব্যবহার করুন, "ব্রিউ ইনস্টল কোরিউটিলস"
এরিক জোহানসন

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 এর মাধ্যমে অনুমতি পরিবর্তন করে তবে "পরিবর্তন" আপডেট করা হবে।


মঞ্জুর, স্ট্যাট আপনাকে প্রাসঙ্গিক তথ্য বলতে পারে। আমরা যা চাই তা পাওয়ার জন্য এটি পার্স করা বেশ ক্লান্তিকর হবে।
পাইপব্রস

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.