কেন -মটাইম +1 কেবল 2 দিনের চেয়ে পুরানো ফাইলগুলি ফেরত দেয়?


115

আমি প্রায় আমার মন মোড়ানো সংগ্রাম করছি কেনfind ব্যাখ্যা করে পরিমার্জন বার দায়ের উপায় এটা আছে। বিশেষত, আমি কেন বুঝতে পারি না যে -mtime +148 ঘন্টা কম বয়সী ফাইলগুলি কেন দেখায় না।

উদাহরণ হিসাবে পরীক্ষা হিসাবে আমি বিভিন্ন পরিবর্তিত তারিখ সহ তিনটি পরীক্ষা ফাইল তৈরি করেছি:

[root@foobox findtest]# ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 25 08:44 foo1
-rw-r--r-- 1 root root 0 Sep 24 08:14 foo2
-rw-r--r-- 1 root root 0 Sep 23 08:14 foo3

আমি তখন -mtime +1স্যুইচটি নিয়ে দৌড়েছি এবং নিম্নলিখিত আউটপুটটি পেয়েছি:

[root@foobox findtest]# find -mtime +1
./foo3

আমি তখন দৌড়ে গিয়েছিলাম -mmin +1440এবং নিম্নলিখিত আউটপুটটি পেয়েছি:

[root@foobox findtest]# find -mmin +1440
./foo3
./foo2

সন্ধানের ম্যান পৃষ্ঠা অনুসারে, আমি বুঝতে পারি যে এটি প্রত্যাশিত আচরণ:

 -mtime n
        File’s  data was last modified n*24 hours ago.  See the comments
        for -atime to understand how rounding affects the interpretation
        of file modification times.


-atime n
       File  was  last  accessed n*24 hours ago.  When find figures out
       how many 24-hour periods ago the file  was  last  accessed,  any
       fractional part is ignored, so to match -atime +1, a file has to
       have been accessed at least two days ago.

এটি এখনও আমার কাছে বোধগম্য নয়। সুতরাং কোনও ফাইল যদি 1 দিন, 23 ঘন্টা, 59 মিনিট, এবং 59 সেকেন্ড পুরানো হয়, find -mtime +1সমস্ত কিছু উপেক্ষা করে কেবল 1 দিন, 0 ঘন্টা, 0 মিনিট এবং 0 সেকেন্ড পুরানো এর মতো আচরণ করে? কোন ক্ষেত্রে, এটি প্রযুক্তিগতভাবে 1 দিনের বেশি নয় এবং এড়ানো হবে?

না ... না ... গণনা।


7
প্রথমে এটি আমার কাছেও মজাদার মনে হয়েছিল, কিন্তু আপনি যখন বিবেচনা করেন যে এটি পূর্ণসংখ্যার দিনগুলিতে কোনও ফাইলের বয়স পরিমাপ করে, তখন এটি আপনি যা প্রত্যাশা করেছিলেন ঠিক তা করে। এটি 1 দিনের পুরানো ফাইলগুলি দেবে না। (১.৯৯) দিনের পুরানো একটি ফাইল>> 1. টি নয়
অক্টোপাস

উত্তর:


86

ওয়েল, সহজ উত্তরটি আমি অনুমান করি যে আপনার অনুসন্ধানের প্রয়োগটি পসিক্স / এসইউএস মানকে অনুসরণ করছে, যা বলে যে এটি অবশ্যই এইভাবে আচরণ করবে। এসইউএসভি 4 / আইইইই ધોરણ 1003.1, 2013 সংস্করণ থেকে উদ্ধৃত করা , "সন্ধান করুন" :

-মটাইম এন
     প্রাইমারিটি সত্য হিসাবে মূল্যায়ন করবে যদি ফাইল সংশোধন সময়টি সূচনার সময়
     থেকে বিয়োগ করে 86400 দ্বারা বিভক্ত (কোনও অবশিষ্ট অংশ বাদে) হয় তবে এন।

(সেই দস্তাবেজের অন্য কোথাও এটি ব্যাখ্যা করে যে nআসলে হতে পারে +nএবং এর অর্থ "এর চেয়ে বড়")।

মানকটি কেন এটি সেভাবে আচরণ করবে বলে ভালভাবে - আমি অনেক আগে থেকেই অনুমান করতে পারি যে কোনও প্রোগ্রামার অলস ছিলেন বা এটি সম্পর্কে চিন্তা করছেন না এবং কেবল সি কোডটি লিখেছিলেন (current_time - file_time) / 86400। সি পূর্ণসংখ্যার গাণিতিক বাকী অংশটি বাদ দেয়। স্ক্রিপ্টগুলি সেই আচরণের উপর নির্ভর করে শুরু হয়েছিল এবং সুতরাং এটি মানক করা হয়েছিল।

বর্ণিত আচরণটি একটি হাইপোথিটিক্যাল সিস্টেমেও বহনযোগ্য হবে যা কেবলমাত্র একটি পরিবর্তনের তারিখ (সময় নয়) সংরক্ষণ করে। আমি জানি না যে এ জাতীয় ব্যবস্থাটি বিদ্যমান ছিল কিনা।


2
সাফটি পরিষ্কার করার জন্য শুধুমাত্র পরিষ্কার কাজ করার জন্য ডিজাইন করা হয়েছিল find
কেজেল্ড ফ্লারুপ

83

যুক্তিটি ফাইলের বয়সের পুরো দিন-mtime সংখ্যা হিসাবে ব্যাখ্যা করা হয় । এর চেয়ে কঠোরতর মানে , এর চেয়ে কঠোরভাবে কম।-mtime +n-mtime -n

নোট করুন যে বাশের সাথে আপনি আরও স্বজ্ঞাত করতে পারেন:

$ find . -mmin +$((60*24))
$ find . -mmin -$((60*24))

যথাক্রমে 24 ঘন্টা চেয়ে পুরানো এবং নতুন ফাইলগুলি সন্ধান করতে।

( -mtimeআপনি কয়েক ঘন্টা বা মিনিটের মধ্যে রেজোলিউশন চাইলে এর জন্য ভগ্নাংশের যুক্তি টাইপ করাও সহজ ))


2
সেই ফাইলগুলি (কেবলমাত্র নিয়মিত) মানব-পঠনযোগ্য মাপের সাথে এবং কালানুক্রমিক ক্রমে তালিকাভুক্ত করতে, করুন$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
এভেজেনি সার্জিভ

1
এটি একই প্রভাব ফেলবে যে এই দু'টি আদেশই একসাথে 24 ঘন্টা আগে সেই এক মিনিটের উইন্ডোর ভিতরে থাকা ফাইলগুলি মিস করবে।
অক্টোপাস

1
$(())সরল শেল গাণিতিক বাক্য গঠন, এটি ব্যাশের সাথে নির্দিষ্ট নয়, সিএফ। pubs.opengroup.org/onlinepubs/009695399/utilities/…
জোসিপ রডিন

@ জোসিপরোডিন না, অগত্যা সত্য নয়! This chapter describes the syntax of that command language as it is used by the sh utility and [...]। যেহেতু বাশ একটি "বর্ধিত" এসএইচ, তাই এটি এই সিনট্যাক্সটিকে সমর্থন করে তবে কিছু অন্যান্য শেল যেমন সিএসএস / টিসিএসএস করে না।
t0r0X

@ t0r0X আমার বক্তব্যটি এটি কোনও বাশিজম নয়, বরং এটি ড্যাশ এবং জেডএসে কাজ করে এবং যা কিছু প্রচলিত হিসাবে কাজ করে /bin/sh
জোসিপ রডিন

44

ভগ্নাংশ 24 ঘন্টা সময়সীমার কাটা হয়! এর অর্থ হল "ফাইন্ড -মটাইম +1" দুটি বা তারও বেশি দিন আগে সংশোধিত ফাইলগুলির সাথে মিল রাখতে বলে।

find . -mtime +0 # find files modified greater than 24 hours ago
find . -mtime 0 # find files modified between now and 1 day ago
# (i.e., in the past 24 hours only)
find . -mtime -1 # find files modified less than 1 day ago (SAME AS -mtime 0)
find . -mtime 1 # find files modified between 24 and 48 hours ago
find . -mtime +1 # find files modified more than 48 hours ago

নিম্নলিখিতগুলি কেবল জিএনইউতে কাজ করতে পারে?

find . -mmin +5 -mmin -10 # find files modified between
# 6 and 9 minutes ago
find / -mmin -10 # modified less than 10 minutes ago

ধন্যবাদ, আমি নির্ধারণ করার চেষ্টা করছিলাম কেন -মাইটাইম এক্স -মটাইম + এক্স থেকে আলাদা ছিল
Vnge

আমি অনুমান করেছি যে + এক্স মানে শর্টস (এক্স + 1, এক্স + 2, এক্স + 3, ...)। :)
এরিক ঝেং

18

সুতরাং যদি কোনও ফাইল 1 দিন, 23 ঘন্টা, 59 মিনিট এবং 59 সেকেন্ড পুরানো হয়, সন্ধান করুন -মাইম +1 সমস্ত কিছু উপেক্ষা করে এবং ঠিক 1 দিন, 0 ঘন্টা, 0 মিনিট এবং 0 সেকেন্ড পুরানো এর মতো আচরণ করে?

হ্যাঁ. যেমনটি man findবলে, "কোনও ভগ্নাংশই উপেক্ষা করা হবে"। যদি আপনি "1 ঘন্টা, 23 ঘন্টা, 59 মিনিট, এবং 59 সেকেন্ড" "24 ঘন্টা" এর মাধ্যমে ভাগ করেন তবে আপনি 1.9999 পেতে পারেন, তবে .9999 অংশটি ছিনিয়ে নেওয়া হয়েছে এবং হঠাৎ ফাইলটি কেবল 1 দিনের পুরানো।


18

-mtime Nএর অর্থ এমন ফাইলগুলি যার বয়স A দিনগুলিতে NA < N +1 কে সন্তুষ্ট করে । অন্য কথায়, ফাইলগুলি নির্বাচন করুন যা সর্বশেষে N এবং N +1 এর মধ্যে পরিবর্তিত হয়েছিল 1 দিন আগে।-mtime N

-mtime -Nফাইল যার বয়স মানে একজন সন্তুষ্ট একজন < এন , অর্থাত্ ফাইল কম পরিবর্তিত এন দিন আগে। কম, intuitively, ফাইল যার বয়স মানে একজন সন্তুষ্ট এন + 1 ≤ একজন , অর্থাত্ ফাইল অন্তত পরিবর্তিত এন + 1 দিন আগে।-mtime +N

উদাহরণস্বরূপ, -mtime 11 থেকে 2 দিন আগে সংশোধিত ফাইলগুলি নির্বাচন করে। -mtime +1কমপক্ষে 2 দিন আগে সংশোধিত ফাইলগুলি নির্বাচন করে। কমপক্ষে 1 দিন আগে ফাইল সংশোধন করতে, ব্যবহার করুন -mtime +0

বিবরণটি "শেষবার 24 ঘন্টা আগে n * সংশোধন করা হয়েছিল" কেবলমাত্র একটি আনুমানিক, এবং খুব পরিষ্কার নয়।

আপনি যদি এই নিয়মগুলি মনে রাখতে অসুবিধা পান তবে পরিবর্তে একটি রেফারেন্স ফাইল ব্যবহার করুন।

touch -d '1 day ago' cutoff
find . -newer cutoff

("1 দিন আগে" সিনট্যাক্সটির জন্য জিএনইউ প্রয়োজন touch))


3
সুন্দর ব্যাখ্যা, প্রথম 3 অনুচ্ছেদের ডকুমেন্টেশনে যুক্ত করা উচিত find!
ম্লেবিয়াস

4

সঠিক ফলাফল পেতে -মিন, -আমিন ইত্যাদি ব্যবহার করুন


6
-?minআর্গুমেন্ট ঠিক মত কাজ -?timeদিন পরিবর্তে মিনিট সঙ্গে ব্যতীত আর্গুমেন্ট। তারা হয় না "সঠিক"।
গিলস

-2

আপনি যদি ২ দিনের চেয়ে ঠিক ৪৮ ঘন্টা পুরানো ফাইল চান তবে --daystartআপনার findকমান্ডটি যুক্ত করা উচিত । এটি আপনাকে সাহায্য করবে।

find . type -f -daystart -mtime +1

5
না, প্রথমে এটি -daystart(একটি জিএনইউ এক্সটেনশন), নয় --daystart। তারপরে, -daystartকেবল বর্তমান সময়ের পরিবর্তে আজকের শুরুর সাথে সময়ের তুলনা --daystart -mtime +1করা, তাই আজকের শুরুর ৪৮ ঘ / ২ ঘন্টা আগে আরও বেশি সংশোধিত ফাইলগুলির প্রতিবেদন করা হত, সুতরাং সাধারণত যে ফাইলগুলি গতকালের আগের দিন আগে কঠোরভাবে সংশোধন করা হয়েছিল ।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.